网址:猫眼电影排行榜
1.前提
首先,Chrome浏览器,右键点击“检查”,打开开发者模式,切换到network,点击当前页面4/。点开后,切换到response,查看源代码。若是直接看elements中的代码,有可能和源代码不同,因为那是经过浏览器加工后的代码。
2.确定爬取目标
我们爬取出电影序号,电影名称,图像链接,主演,电影上映时间
3.页面分析
我们通过分析页面,发现关于一部电影的信息,都在dd标签中。
电影序号在<i class="board-index board-index-1">
后
电影名称在title=
之后
图像链接在img src=
之后
主演在class=star
之后
上映时间在class="releasetime"
之后
4.正则表达式
用每个信息之前的节点来开头,比如用class="board
当作爬取电影序号的开头
用.*?
来匹配开头与节点信息之间的内容,?
用来非贪婪匹配
对于节点信息用(.*?)来匹配,其后写网页源代码中后面的代码。比如电影序号后的代码是</i>
,就写(.*?)</i>
。电影名称后的代码为 class="image-link
,我们就写/sclass="image-link
,/s
是匹配空格,class="image-link
为其后的代码,我们就用(.*?)/sclass="image-link
来匹配
最终代码如下
<dd>.*?board-index.*?>(.*?)</i>.*?title="(.*?)"\sclass="image-link".*?data-src="(.*?)"\salt.*?class="star">\s*(.*?)\s*</p>.*?releasetime">(.*?)</p>
因为我们要爬取整个页面所有电影,所以要多次匹配
所以我们用re.compile()将正则表达式编译成一个正则表达式对象,然后用re.findall()爬取。
5.最终完整代码
import requests
import re
import pandas as pd
import time
def get_html(url):
headers = {
'User-Agent': 'Mozilla/5.0 (MSIE 10.0; Windows NT 6.1; Trident/5.0)'
}
response = requests.get(url,headers = headers)
time.sleep(0.2)
if response.status_code == 200:
return response.text
return None
def get_infomation(html):
str = re.compile('<dd>.*?board-index.*?>(.*?)</i>.*?title="(.*?)"\sclass="image-link".*?data-src="(.*?)"\salt.*?class="star">\s*(.*?)\s*</p>.*?releasetime">(.*?)</p>',re.S)
items = re.findall(str,html)
index,name,img,actor,data = [],[],[],[],[]
for i in items:
index.append(i[0]),
name.append(i[1]),
img.append(i[2]),
actor.append(i[3]),
data.append(i[4])
tammol_movie = pd.DataFrame(
data={
'电影名称':name,
'图像链接':img,
'演员':actor,
'放映日期':data
},
index=index
)
print(tammol_movie)
def main():
#for i in range(0,10):
url = 'https://maoyan.com/board/4/'#/?offset = '+ str(10*i)
html = get_html(url)
get_infomation(html)
main()
更多关于正则表达式的内容,可看崔庆才先生的《python3网络爬虫开发实战》一书