最近想做一个图书排行榜的一个web项目,基础框架也搭建完毕。但是在实现View的时候,发现了一个问题——坑爹啊 小哥我没数据啊 !!! 不过哥我也很机智,瞬间就有了两个方案:
1.搭好管理后台,然后自己手动录入数据。因为是想做一个图书排行,所以数据量不会太大,感觉还能接受(-_-P 后来看了下爬完之后的数据, 才发现哥太天真了!!!)
2.写个爬虫,偷个懒(切 , 懒惰的程序员才是优秀的程序员)
废话说的过多了,现在开始介绍BeautifulSoup(基础介绍抄袭为主,补充为辅哈~):
快速介绍
引用块内容
安装:
easy_install beautifulsoup4
pip install beautifulsoup4
其实我是这么装的:
apt-get install python-bs4导入:
from bs4 import BeautifulSoup
如果直接install beautifulsoup4的话,卡在这块的童鞋比较多,所以我也只是其中一个而已
网上很多介绍(包括一些文档)都是从:
html_doc = ”’ ……………. ”’ #html文本
soup = BeautifulSoup(html_doc)
这么开始,文鱼忍不住吐个槽,与其费一大推劲,把html转成字符串变量还不是一直复制到编辑器里ctrl+f来的快了呢,所以应该是这么开始比较合理
import urllib2
r = urllib2.urlopen(‘http://item.jd.com/11715365.html‘)
contents = r.read()
soup = BeautifulSoup(contents, “html.parser”)
后边就是基本属性使用了:
输出soup对象中的第一个的a(其他div, p, h1什么都一样)标记
print soup.a输出div下的第一的p(同上)
print soup.div.p…………
(其实这么玩可以玩很久 知道最后一个节点(soup.div.p.a.img))
进阶部分:
(统一同上)
获取所有的a标签
soup.find_all(‘a’)
获取所有class为test的a标签
soup.find_all(‘a’, attrs={‘class’: ‘test’})
获取第一的class为test的a标签的 href和标签中的文本
a_tags = soup.find_all(‘a’, attrs={‘class’: ‘test’})a_tags[0][‘href’]
a_tags_soup[0].text
其实有时需要把soup.find_all()取出的结果再做一次BeautifulSoup ,方便往下遍历,注意一定要先把soup.find_all()返回转换成str类
book_author_soup = soup.find_all(‘div’, attrs={‘id’: ‘p-author’})
book_author_soup = BeautifulSoup(str(book_author_soup), ‘html.parser’)
book_author = book_author_soup.a
说了这么多,发个干货,豆瓣和京东每周在 book.douban.com/book.jd.com上更新的图书爬取并保存到数据库
#!/usr/bin/env python
#-*-coding: utf-8-*-
import os,sys
reload(sys)
sys.setdefaultencoding("utf-8")
import urllib2
import re
import web
from bs4 import BeautifulSoup
class Crawler(object):
def __init__(self, url):
self.page = urllib2.urlopen(url)
self.contents = self.page.read()
self.soup = BeautifulSoup(self.contents, "html.parser")
class SaveBookInfo(object):
def save_book(self, **kwargs):
self.save_book_data(kwargs)
#获取作者的外键
#如果作者信息不存在则保存作者信息
def get_author_id