Python-爬虫案例(简单保姆级、基础入门、小白篇)

案例:爬取豆瓣网电影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>.*?)&nbsp.*?<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>.*?)&nbsp.*?<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)

运行结果

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值