简介
这次的爬虫训练是对豆瓣top250信息的爬取,比较简单的静态页面的爬取,本人也是初学者,为了防止学习的困难,我尽量写的详细点,建议先把代码复制一遍,看能不能成功运行,再过来看,免得到时候全部看完了,代码不能运行,到时候自己解决也是蛮麻烦的,毕竟爬虫更新换代也是蛮快的
目标需求
对豆瓣top250所有信息进行爬取,包括影名、格言、评分,先存为.csv文件,最后转为excel表格存储
运用知识
requests库,lxml解析库,csv文件保存
分析
1.进入到豆瓣top250主界面,进行如下操作,基本得到了我们需要信息的源码
2.分析每一页的url,找出相应规律
第一页:
第二页:
我们发现start=0和start=25有所不同,其余都是一样的,我们陆续查看后面几页url,发现start的值以25递增,由此我们可以推出各页的url
源码部分
有部分注释
import requests
import csv
from lxml import etree
# 得到第i页的源代码
def get_resource(page): # 传入参数为页数
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.142 Safari/537.36'
} # 设置请求头
page_head=page*25
page_url = 'https://movie.douban.com/top250?start=%d&filter=' % page_head # 得到每页的url
try:
response = requests.get(page_url, headers=headers) # 加个请求头,伪装一下,否则会被识别出来,具体错误可看返回的状态码
response.raise_for_status() # 若返回状态码不是200,则抛出异常
response.encoding =response.apparent_encoding # 设置编码格式和网站编码格式相同,防止后面乱码
except Exception as e:
print('爬取失败')
else:
return response.text # 爬取成功,则返回该页源码信息
#信息处理,并写入csv文件
def handle_info(i,selector):
selector = etree.HTML(selector) # 构造一个xpath解析对象
number = selector.xpath('//em/text()')
name = selector.xpath('//span[@class="title"][1]/text()')
motto = selector.xpath('//span[@class="inq"]/text()')
score = selector.xpath('//span[@class="rating_num"]/text()')
# 多次调试后,发现第240,242,247,250个没有格言,我们把其设置为空,否则后面会乱
# 第九页,它们的motto下标分别为 14,16,21,24
if i==9:
motto.insert(14, " ");
motto.insert(16, " ");
motto.insert(21, " ");
motto.insert(24, " ");
for m in range(25):
all_info = [number[m], name[m], motto[m], score[m]] # 形成列表,后面插入
with open('douban_top250.csv', 'a+', newline='', encoding='utf-8') as csvfile:
writer = csv.writer(csvfile)
writer.writerow(all_info) # 按行写入
if __name__=='__main__':
# 写入第一行,确定每列名称
with open('data.csv', 'w', newline='', encoding='utf-8') as csvfile:
writer = csv.writer(csvfile)
writer.writerow(['number', 'name', 'motto', 'score'])
# 一共10页
for i in range(0,10):
selector=get_resource(i)
handle_info(i,selector)
代码部分额外解释
- name = selector.xpath(’//span[@class=“title”][1]/text()’):
在span标签,且其class属性值为title,有两个满足该条件的,我们取第一个,text()表示取其文本值 - motto = selector.xpath(’//span[@class=“inq”]/text()’):
在span标签,且其class属性值为inq,text()表示取其文本值 - with open(‘douban_top250.csv’, ‘a+’, newline=’’, encoding=‘utf-8’) as csvfile:该句中newline=’’,防止每写入一行,就插入一个空行,encoding='utf-8’保证编码格式的统一
实现效果
解决excel打开csv文件乱码,并保存为excel文件
pycharm中打开csv文件:
excel文件:
结语
本程序中对lxml未得到的格言,手动查找,以空格赋值,不是很恰当,我也是想不出什么好办法,才这么写的,有其他解决办法,望告知!