先爬取第一页的榜单电影
import requests
import time,json,re
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/87.0.4280.66 Safari/537.36'
}
res = requests.get(url,headers=headers)
# print(res.text)
pat ='<i class="board-index board-index-[0-9]+">([0-9])</i>.*?<img data-src="(.*?)" alt="(.*?)" class="board-img" />.*?<p class="star">(.*?)</p>.*?<p class="releasetime">(.*?)</p>.*?<p class="score"><i class="integer">([0-9.]+)</i><i class="fraction">([0-9.])</i></p> '
# pat = '<i class="board-index board-index-[0-9]+">([0-9])</i>.*?<img data-src="(.*?)" alt="(.*?)" class="board-img" />.*? <p class="star">(.*?)</p>.*?<p class="releasetime">(.*?)</p>.*?<p class="score"><i class="integer">([0-9.]+)</i><i class="fraction">([0-9])</i></p>'
html = res.content.decode('utf-8')
# print(html)
items = re.findall(pat,html,re.S) #我没加re.S,是返回一个空值
print(items)
# for item in items():
# print(item)
封装函数,完整版代码
'''
使用requests爬虫库爬取猫眼电影中榜单栏⽬中TOP100榜的所有电影信息,并将信息
写⼊⽂件
⽬标:使⽤urllib分⻚爬取猫眼电影中榜单栏⽬中TOP100榜的所有电影信息,并将信息写⼊⽂件
URL地址:https://maoyan.com/board 其中参数offset表示其实条数
获取信息:{排名,图⽚,标题,主演,放映时间,评分}
分析:
URL地址: 第一页:https://maoyan.com/board/4?offset=0
第二页:https://maoyan.com/board/4?offset=10
第三页:https://maoyan.com/board/4?offset=20
第四页:https://maoyan.com/board/4?offset=30
请求方式:GET ---------找到Network,刷新一下之后,找到描述网址的那个页面,查看General -> Request Method
参数:offset: 0~90
返回信息:HTML代码
'''
import requests
import time,json,re
from requests.exceptions import RequestException
# 抓取网页内容
def getPages(url):
try:
# 封装请求头信息
headers = {
'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.66 Safari/537.36'
}
res = requests.get(url,headers = headers)
print(res.status_code)
if res.status_code == 200:
#1.一种写法:
res.encoding = 'utf-8'
# print(res.text)
return res.text
else:
return None
except RequestException:
return None
#解析抓取的内容
def paresPages(html):
# 使用正则进行解析
pat = '<i class="board-index board-index-[0-9]+">([0-9]+)</i>.*?<img data-src="(.*?)" alt="(.*?)" class="board-img" />.*? <p class="star">(.*?)</p>.*?<p class="releasetime">(.*?)</p>.*?<p class="score"><i class="integer">([0-9.]+)</i><i class="fraction">([0-9])</i></p>'
items = re.findall(pat,html,re.S)
# 如果不使用re.S参数,则只在每一行内进行匹配,如果一行没有,就换下一行重新开始。
# 而使用re.S参数以后,正则表达式会将这个字符串作为一个整体,在整体中进行匹配。
for item in items:
yield {
'index':item[0],
'image':item[1],
'title':item[2],
'actor':item[3].strip()[3:],
'time':item[4].strip()[5:],
'score':item[5]+item[6],
}
# print(item)
# 存储内容
def writeFile(content):
with open("./esult.txt",'a',encoding='utf-8') as f:
f.write(json.dumps(content,ensure_ascii=False) + "\n")
#主函数调用
def main(offset):
url = 'https://maoyan.com/board/4?offset='+str(offset)
html = getPages(url)
if html:
# writeFile(item)
for item in paresPages(html):
writeFile(item)
# 判断当前执⾏是否为主程序运⾏,并遍历调⽤主函数爬取数据
if __name__ == '__main__':
for i in range(10):
main(offset=i*10)
time.sleep(1)
其实这里还有一个问题是,这个文件esult.txt,跑代码的时候并没有被创建进当前文件夹,所以我是手动创建的,然后代码写入
如果出不了结果,刷新猫眼电影的网页,然后看看是否是登录,这个必须要登录状态才能爬取,且时不时要刷新