案例:爬取豆瓣网电影top250的电影名、年份、评分、评价人数
思路:
1.拿到页面代码(在爬虫代码中,请求被爬取的页面代码,拿到它)
2.使用相应的规则在代码中提取我们需要的数据(re正则)
第一步:导入包
import re
import requests
re是我们拿到代码时,根据re正则提取需要数据。
requests是我们向所被爬取的页面发送的一个请求,告诉被爬取页面,我们需要你的代码,然后被爬取页面会将页面代码打包,放在一个对象里面,我们在这个对象里面取页面代码。
第二步:写链接
url = "https://movie.douban.com/top250"
第三步:发送请求
head = {
"User-Agent" : "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/127.0.0.0 Safari/537.36 Edg/127.0.0.0"
}
resp = requests.get(url,headers=head)
定义一个对象resp,将取到的代码放在resp对象里。
requests.get(url,headers=head)。发送请求时要告诉路径url。headers是此网站的一个反爬虫措施,正常的top250页面请求它会告诉页面"User-Agent" = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/127.0.0.0 Safari/537.36 Edg/127.0.0.0"
但是咱们在爬虫时,如果不设置"User-Agent"值时,"User-Agent"将会是别的数据,因此我们需要设置一下"User-Agent"的值,至于设置成什么值要看下被爬取页面的值。如下:
第四步:测试目前代码,看能否拿到被爬取网页代码
代码:
import re
import requests
url = "https://movie.douban.com/top250"
head = {
"User-Agent" : "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/127.0.0.0 Safari/537.36 Edg/127.0.0.0"
}
resp = requests.get(url,headers=head)
print(resp.text)
运行结果:
运行结果是咱们取到了被爬网页的代码!好,到这里,我们取得了阶段性的胜利。接下来,咱们需要做的是使用re正则在代码中提取我们需要的数据。
第五步:写出咱们需要的正则表达式
obj = re.compile(r'<div class="item">.*?<span class="title">(?P<name>.*?)</span>'
r'.*?<br>(?P<year>.*?) .*?<span class="rating_num" '
r'property="v:average">(?P<score>.*?)</span>.*?'
r'<span>(?P<num>.*?)人评价</span>',re.S) #re.S可以让re匹配到换行符
页面代码:
一定要阅读5.1—5.4才可理解上面的代码
5.1 re.compile()是用来优化正则的,它将正则表达式转化为对象。
5.2 .*?的作用是,可以抓取到期间的任何信息
比如:张三早上偷了100元,然后去上班了。
张三.*?上班,则.*?捕捉到的内容是:早上偷了100元,然后去。
5.3 哪里是我们需要的数据,则给它带个括号并且取一个名字,好找到它。
例如:(?P<name>.*?) ,就是将.*?取到的东西带个括号,取了个名字为name
5.4 re.S ,.*?什么都可以捕捉到,就是捕捉不到换行,加个re.S,则.*?可以捕捉到换行。
第六步:将取得的代码按照第五步表达式规则取出,封装在对象result里
result = obj.finditer(resp.text)
以迭代器的形式封装在result
第七步:从result里取出结果
for item in result:
dic = item.groupdict()
print(dic)
dic = item.groupdict() 用于从正则表达式匹配对象中提取捕获组的字典。
输出当前结果:
运行目标大致达到,但是year输出有多余的空格。
原因:
解决:加代码
dic['year'] = dic['year'].strip() #去掉年份左右两端的空白
运行结果:
至此,此次爬虫教程结束。
总结:
总代码
import re
import requests
url = "https://movie.douban.com/top250"
head = {
"User-Agent" : "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/127.0.0.0 Safari/537.36 Edg/127.0.0.0"
}
resp = requests.get(url,headers=head)
# print(resp.text)
obj = re.compile(r'<div class="item">.*?<span class="title">(?P<name>.*?)</span>'
r'.*?<br>(?P<year>.*?) .*?<span class="rating_num" '
r'property="v:average">(?P<score>.*?)</span>.*?'
r'<span>(?P<num>.*?)人评价</span>',re.S) #re.S可以让re匹配到换行符
result = obj.finditer(resp.text)
for item in result:
dic = item.groupdict()
dic['year'] = dic['year'].strip() # 去掉年份左右两端的空白
print(dic)
运行结果