这是在学习阶段写的爬虫,爬取的是豆瓣图书Top250榜的名称,作者,评分等数据
第一次写文章,如果有什么问题,欢迎各位大佬进行指正,谢谢来踩。
1.首先需要明确自己想要爬取的内容,并在网页中查看数据是否真实存在,右键检查网页源码即可。
2.确定好目标后,点击一下下一页,对比两页的url,看能否找到规律。将有变化的地方用花括号表示 --->:https://book.douban.com/top250?start={}
3.开始编写代码,首先导入需要用到的包。这里我用到了requests模块;在lxml里导入了etree模块,因为要用到xpath解析(如果用正则解析则需要导入re模块);用到随机的UA所以在fake_useragent中导入了UserAgent;导入黄金组合time与random是为了控制访问频率,避免不必要的麻烦。
目录
这是在学习阶段写的爬虫,爬取的是豆瓣图书Top250榜的名称,作者,评分等数据
第一次写文章,如果有什么问题,欢迎各位大佬进行指正,谢谢来踩。
4.根据我的个人习惯,我会先把需要爬取得内容的xpath放在代码中注释,这样用的时候就能快速得到。 在Chrome浏览器中,找到需要的位置右键copy xpath即可,也可以自己手写。
5.创建一个类,定义__init__函数将处理后的url放在__init__函数中方便调用。
class DoubanSpider:
def __init__(self):
self.url = 'https://book.douban.com/top250?start={}'
6.定义获取页面数据的函数。我将请求头放在了这个函数中,大部分网页都会有基于请求头的反扒,随机的UA可以解决一部分,在出现问题可能是网页检查cookie,打开网页复制一下cookie放入请求头即可,要以字典键值对的形式。最后调用解析函数,如果思路清晰可先写下然后alt+shift+回车即可自动创建,也是一个偷懒的小技巧=.=。
def get_html(self,url):
headers = {
"User-Agent":UserAgent().random
}
html = requests.get(url=url,headers=headers).content.decode('utf-8','ignore')
self.parse_html(html)
7.定义解析函数,将获取到的页面数据进行解析,因为在页面中这些数据在一个table下,所以做个列表将所有数据先解析出来,然后遍历列表再匹配自己想要的数据。这里我定义了一个字典来接收数据,因为有些数据可能会有缺失,所以用None来填补防止报错。然后打印内容,根据数据的形式对数据进行切片整理,做到稍微美观一些。
if xx_list else None
8.定义一个run函数,将需要传参的地方填补一下,因为共250本书,每一页是25本,所以共十页,将url拼接完整后传给get_html函数,在调用解析函数进行解析,参数搞定。设置一下访问频率,我采用了随机数,防止网页对我有意见。
def run(self):
for page in range(10):
page_url = self.url.format(page*25)
self.get_html(url=page_url)
time.sleep(random.uniform(2,5))
9.在尾部不要有缩进,打出main就会自动补全,创建一个引擎,运行整个爬虫文件。
这是全部源码,网页内容可能变更,所以当您阅读时是否还能用就需要尝试一下了
import requests
from lxml import etree
from fake_useragent import UserAgent
import time
import random
#xpath解析
# title = '//table//a/@title'
# info = '//table//p[@class="pl"]'
# socre = '//table//div/span[@class="rating_nums"]/text()'
# commit = '//table//div/span[@class="pl"]/text()'
# comment = '//table//p/span/text()'
class DoubanSpider:
def __init__(self):
self.url = 'https://book.douban.com/top250?start={}'
def get_html(self,url):
headers = {
"User-Agent":UserAgent().random
}
html = requests.get(url=url,headers=headers).content.decode('utf-8','ignore')
self.parse_html(html)
def parse_html(self, html):
p = etree.HTML(html)
tab_list = p.xpath("//table")
for tab in tab_list:
item = {}
name_list = tab.xpath('.//a/@title')
item['title'] = name_list[0].strip() if name_list else None
info_list = tab.xpath('.//p[@class="pl"]/text()')
item['info'] = info_list[0].strip() if info_list else None
score_list = tab.xpath('.//div/span[@class="rating_nums"]/text()')
item['score'] = score_list[0].strip() if score_list else None
commit_list = tab.xpath('.//div/span[@class="pl"]/text()')
item['commit'] = commit_list[0].strip()[1:-1].strip() if commit_list else None
comment_list = tab.xpath('.//p/span/text()')
item['comment'] = comment_list[0].strip() if comment_list else None
print(item)
# url = 'https://book.douban.com/top250?start={}'
# headers = {
# 'User-Agent':UserAgent().random
# }
def run(self):
for page in range(10):
page_url = self.url.format(page*25)
self.get_html(url=page_url)
time.sleep(random.uniform(2,5))
if __name__ == '__main__':
B = DoubanSpider()
B.run()