原文地址:https://blog.csdn.net/weixin_41779359/article/details/86246805
感谢原作者:昵称用刘昊也不行 的分享,很实用的能跟着一步一步做的教程,容易理解
1、正则表达式的使用
用正则表达式获取想要的信息:
Str='<p class="name"><a href="/films/1215919" title="印度合伙人" data-act="boarditem-click" data-val="{movieId:1215919}">印度合伙人</a></p>\
<p class="name"><a href="/films/123" title="龙猫" data-act="boarditem-click" data-val="{movieId:123}">龙猫</a></p>'
注意观察,我们要取的是电影名称,
方法一:取>...<之间的电影名称
data=re.findall('<p class="name"><a .*?>(.*?)</a></p>',Str,re.S)
Out[19]: ['印度合伙人', '龙猫']
可以看出()里面表示想要取出的内容
方法2:取title=之后的电影名称
data=re.findall('<p class="name"><a .*?title="(.*?)".*?',Str,re.S)
下面我们要一次性提取所有电影的名字和演员的信息:
data='<p class="name"><a href="/films/1215919" title="印度合伙人" data-act="boarditem-click" data-val="{movieId:1215919}">印度合伙人</a></p><p class="star">主演:阿克谢·库玛尔,拉迪卡·艾普特,索娜姆·卡普尔<p class="name"><a href="/films/123" title="龙猫" data-act="boarditem-click" data-val="{movieId:123}">龙猫</a></p><p class="star">主演:帕特·卡洛尔,蒂姆·达利,丽娅·萨隆加</p>'
result=re.findall('title="(.*?)".*?主演:(.*?)<',data,re.S)
Out[25]: [('印度合伙人', '阿克谢·库玛尔,拉迪卡·艾普特,索娜姆·卡普尔'), ('龙猫', '帕特·卡洛尔,蒂姆·达利,丽娅·萨隆加')]
可以看见,单个电影的结果是一个元组,我们删除印度合伙人的演员名称,会得到如下结果:
Out[27]: [('印度合伙人', ''), ('龙猫', '帕特·卡洛尔,蒂姆·达利,丽娅·萨隆加')]
2、Headers的设置
在实际操作中,可以通过如下方法来进行headers信息的查找(详细版):
有的时候,还会遇到加密的JS或者乱序的JS,这时候需要找到对应的解密方法
import requests
import re
第一个库是用来向服务器发送请求获得响应的,第二个库是正则表达式用来提取数据的。
假如我们要获得猫眼电影榜单top100的电影信息,网址为https://maoyan.com/board/4?,那么我们首先要到这个网页中大体浏览一下。
可以看到每一页有十个电影,一共有10页,也就是说我们想要的信息在十个网页上,那么我们就需要这十个网页的url。我们先看如何提取一个网页的信息,最后在讲如何提取这十个网页的数据。
了解大体情况后,就打开网页源代码(右击选择查看网页源代码),看一看我们需要的信息(比如电影的名字)在源代码页的哪个位置。可以用control+F快速定位。
我们已经有url,可以通过浏览器向服务器发送请求了。但实际是我们并不是通过浏览器向服务器发送请求的,而是通过爬虫。如果服务器识别出来请求时爬虫发出来的,那么我们就会被屏蔽掉,获得不了任何响应。所以我们要把我们写的爬虫包装成浏览器。这需要在发送请求的时候加上headers参数。
url='https://maoyan.com/board/4?'
headers={"user-agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.98 Safari/537.36" }
def get_page(url):
try:
response=requests.get(url,headers=headers)
response.raise_for_status()
response.encoding=response.apparent_encoding
return response.text#这就是我们写这个函数所需要的结果,网页原代码。
except Exception as e:
print(e)
Headers就是我们伪装成浏览器所需要的参数,是字典形式,每次爬虫都需要取所爬取的网站去复制一下,获得方法:打开检查页,点击network,按f5刷新,此时左侧会更新出很多网页,然后谁便点击一个,让后点击headers,将页面往下拉,找到request headers,复制里面的user-agent。
3、猫眼电影top100榜单爬取
整体程序如下(亲测可跑通,python3):
import requests
import re
import xlwt
url='https://maoyan.com/board/4?'
headers={ "user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.98 Safari/537.36" }
def get_page(url):
try:
response=requests.get(url,headers=headers)
if response.status_code==200: #HTTP状态码,表示网络请求成功的意思,返回这个状态表示已经获取到数据了
return response.text
else:
print('获取网页失败')
except Exception as e:
print(e)
def get_info(page):
items=re.findall('board-index .*?>(\d+)</i>.*?class="name"><.*?>(.*?)</a></p>.*?<p class="star">.*?'+
'主演:(.*?) .*?</p>.*?<p class="releasetime">(.*?)</p>.*?<p class="score"><i class="integer">'+
'(.*?)</i><i class="fraction">(\d+)</i></p>',page,re.S)
for item in items:
data={}
data['rank']=item[0]
data['title']=item[1]
actors=re.sub('\n','',item[2])
data['actors']=actors
data['date']=item[3]
data['score']=str(item[4])+str(item[5])
yield data
urls=['https://maoyan.com/board/4?offset={}'.format(i*10) for i in range(10)]
DATA=[]
for url in urls:
page=get_page(url)
datas=get_info(page)
for data in datas:
DATA.append(data) #将所有的数据添加到DATA里,list格式储存,list里面的元素是字典
f=xlwt.Workbook(encoding='utf-8')
sheet01=f.add_sheet(u'sheet1',cell_overwrite_ok=True)
sheet01.write(0,0,'rank') #第一行第一列
sheet01.write(0,1,'title')
sheet01.write(0,2,'actors')
sheet01.write(0,3,'date')
sheet01.write(0,4,'score')
#写内容
for i in range(len(DATA)):
sheet01.write(i+1,0,DATA[i]['rank'])
sheet01.write(i+1,1,DATA[i]['title'])
sheet01.write(i+1,2,DATA[i]['actors'])
sheet01.write(i+1,3,DATA[i]['date'])
sheet01.write(i+1,4,DATA[i]['score'])
print('p',end='')
f.save('E:\\猫眼电影.xls')