网络爬虫(又称为网页蜘蛛,网络机器人,在FOAF社区中间,更经常的称为网页追逐者),是一种按照一定的规则,自动地抓取万维网信息的程序或者脚本。另外一些不常使用的名字还有蚂蚁、自动索引、模拟程序或者蠕虫。
语言:Python IDE(开发环境):PyCharm
模块:request 、re
第一部分:获取网页的源代码
一、安装request包
pip install request
二、使用request的get方法得到网页的回应
resp = requests.get(url, headers=headers, params=pra)
其中:
1.url是网站的意思,参数中以字符串的形式代入
2.headers是headers是解决requests请求反爬的方法之一,调整它可以伪装身份
3.params是一些参数设置
三、得到网站的信息
print(type(res))
print(res.status_code) # 获取相应状态码
print(type(res.text))
print(res.cookies) # 可存储与用户相关的信息
print(res.json()) # 输出网页源代码的两种方式
print(res.text)
栗子:获取豆瓣网页的源代码:
import requests
url = 'https://movie.douban.com/typerank?'
pra = { # 网页的参数可以在网页中按F12查取
'type': '24',
'interval_id': '100:90',
'action': '',
'start': 0,
'limit': '20',
}
# 查请求头和pra的做法一样
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) '
'Chrome/92.0.4515.131 Safari/537.36 SLBrowser/8.0.0.7062 SLBChan/25'}
resp = requests.get(url, headers=headers, params=pra)
print(resp.text)
# print(resp.json())
resp.close() # 善始善终
第二部分:选择提取网页信息
pip install re
这个部分我们将要用到re模块,该模块能帮我们挑选出所有符合正则的数据内容
# (手动注释) 至于正则表达式的内容我就不过多赘述了,大伙感兴趣的话可以去b站学习一下
在这里我仅做一个小李子:
import re
# findall 匹配字符串中所有的符合正则的内容
lst = re.findall(r"\d+", '我的学号是1000400035,1000400001')
print(lst)
# finditer 匹配字符串中所有的内容[返回的是迭代器] 从迭代器中拿到内容需要 .group()
it = re.finditer(r"\d+", '我的学号是1000400035,1000400001')
for i in it:
print(i.group())
# search返回的结果是match对象 拿数据需要 .group() search找到一个就返回
s = re.search(r"\d+", '我的学号是1000400035,1000400001')
print(s.group())
# match是从头开始匹配的
s = re.match(r"\d+", '1000400035,1000400001')
print(s.group())
输出结果:
['2007400035', '2007400001']
2007400035
2007400001
2007400035
2007400035
有了这个认识,我们就上点强度啦。
任务:提取网页源代码内容中特定的信息,如序号和人物名称
<div class='jay'><span id='1'>郭麒麟</span></div>
<div class='jj'><span id='2'>宋铁</span></div>
<div class='jolin'><span id='3'>大聪明</span></div>
<div class='sylar'><span id='4'>范思哲</span></div>
<div class='tory'><span id='5'>胡说八道</span></div>
做法:
com = re.compile(r"<div class='.*?'><span id='(?P<id>.*?)'>(?P<haha>.*?)</span></div>", re.S) # re.S : 让.能匹配换行符
obj = com.finditer(s)
for i in obj:
print(i.group('id'), i.group("haha"))
其中的(?P<id>.*?)是提取信息的一种方式,id是提取到的信息的代号
输出结果如下:
1 郭麒麟
2 宋铁
3 大聪明
4 范思哲
5 胡说八道
第三部分:综合运用resquest和re模块,获取豆瓣电影排行榜
# 先得到网页的源代码 ----------requests
# 通过re来获取有效的信息 ---------re
import requests
import re
url = 'https://movie.douban.com/top250'
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) "
"Chrome/92.0.4515.131 Safari/537.36 SLBrowser/8.0.0.7062 SLBChan/25 "}
resp = requests.get(url, headers=headers)
page_content = resp.text # 拿到网页源代码
# 下面开始解析数据
obj = re.compile(r'<li>.*?<div class="item">.*?<span class="title">(?P<name>.*?)</span>.*?<p class="">.*?<br>('
r'?P<year>.*?)&n.*?</p>.*?<span class="rating_num" property="v:average">(?P<evaluate>.*?)'
r'</span>.*?<span>(?P<number>.*?)人评价</span>', re.S)
result = obj.finditer(page_content)
for i in result:
print("年份是:", i.group('year').strip(), "电影名字是:", i.group("name"),
"评分是:", i.group('evaluate'), '评价人数是:', i.group('number')) # .strip是消除年份前面的一大堆空白
结果:
年份是: 1994 电影名字是: 肖申克的救赎 评分是: 9.7 评价人数是: 2697297
年份是: 1993 电影名字是: 霸王别姬 评分是: 9.6 评价人数是: 2000135
年份是: 1994 电影名字是: 阿甘正传 评分是: 9.5 评价人数是: 2024951
年份是: 1997 电影名字是: 泰坦尼克号 评分是: 9.4 评价人数是: 1984500
年份是: 1994 电影名字是: 这个杀手不太冷 评分是: 9.4 评价人数是: 2167745
年份是: 1997 电影名字是: 美丽人生 评分是: 9.6 评价人数是: 1243237
年份是: 2001 电影名字是: 千与千寻 评分是: 9.4 评价人数是: 2101338
年份是: 1993 电影名字是: 辛德勒的名单 评分是: 9.6 评价人数是: 1037310
年份是: 2010 电影名字是: 盗梦空间 评分是: 9.4 评价人数是: 1937109
年份是: 2014 电影名字是: 星际穿越 评分是: 9.4 评价人数是: 1642543
年份是: 2009 电影名字是: 忠犬八公的故事 评分是: 9.4 评价人数是: 1321680
年份是: 1998 电影名字是: 楚门的世界 评分是: 9.3 评价人数是: 1559973
年份是: 1998 电影名字是: 海上钢琴师 评分是: 9.3 评价人数是: 1577903
年份是: 2009 电影名字是: 三傻大闹宝莱坞 评分是: 9.2 评价人数是: 1754281
年份是: 2008 电影名字是: 机器人总动员 评分是: 9.3 评价人数是: 1240380
年份是: 2004 电影名字是: 放牛班的春天 评分是: 9.3 评价人数是: 1223585
年份是: 2002 电影名字是: 无间道 评分是: 9.3 评价人数是: 1256752
年份是: 2016 电影名字是: 疯狂动物城 评分是: 9.2 评价人数是: 1782802
年份是: 1995 电影名字是: 大话西游之大圣娶亲 评分是: 9.2 评价人数是: 1439696
年份是: 2011 电影名字是: 熔炉 评分是: 9.3 评价人数是: 876248
年份是: 1957 电影名字是: 控方证人 评分是: 9.6 评价人数是: 489804
年份是: 1972 电影名字是: 教父 评分是: 9.3 评价人数是: 897851
年份是: 2006 电影名字是: 当幸福来敲门 评分是: 9.2 评价人数是: 1429513
年份是: 2011 电影名字是: 触不可及 评分是: 9.3 评价人数是: 1015803
年份是: 2010 电影名字是: 怦然心动 评分是: 9.1 评价人数是: 1718079
从结果可以看出:
哥哥的霸王别姬是相当受欢迎的,并且程序只能够获取当前网页的电影排行榜,想要更多的排行还需要我们自己手动切换网站。(更换网址就好了,其他信息是一样滴)