我们用正则表达式来完成这个任务,并把读取到的内容写入到文本中。
首先打开猫眼电影的榜单,网址是这个:http://maoyan.com/board
首先获取该网页的html代码,注意千万别用开发者模式查看网页的源码,源码可能和response.text不一样
然后用python的第三方库,requests库进行网页html的爬取
注意:1、在获取源代码之前我们要设置一下user-Agent 2、如果获取失败要进行异常处理
代码如下:
def get_single_page(url):
headers = {
'User - Agent': 'Mozilla / 5.0(Windows NT 10.0;'
+ 'WOW64;'
+'rv: 61.0) Gecko / 20100101'
+'Firefox / 61.0'
}
response = requests.get(url)
try:
if (response.status_code == 200):
return response.text
return None
except requests.exceptions.HTTPError:
return None
相应的主函数:
def main(url):
html = get_single_page(url)
print(html)
然后用python自带的模块--re块,进行正则表达式的写入。
由于电影页面等信息都在<dd></dd>标签页下,所以我们写的正则表达式开头加上<dd>,结尾加上</dd>。
正则表达式如下:
pattern = re.compile(
'<dd>.*?board-index.*?>(\d+)</i>' #排名
+'.*?data-src="(.*?)".*?>'#图片
+'.*?title.*?>(.*?)</a>'#电影名
+'.*?star.*?>(.*?)</p>'#主演
+'.*?releasetime.*?>(.*?)</p>'#上映时间
+'.*?integer.*?>(.*?)</i>'#排名整数
+'.*?fraction.*?>(.*?)</i>.*?</dd>'#排名小数
,re.S
)
有了这些,我们直接用findall函数获取的内容直接打印下来
response = re.findall(pattern,html)
print(response)
打印后我们发现内容很乱,应为findall函数返回的是一个列表,所以我们通过yield进行分类:
for item in response:
yield {
'index':item[0],
'img':item[1],
'name':item[2],
'star':item[3],
'realeasetime':item[4],
'integer':item[5],
'fraction':item[6]
}
这样输出的结果就好看了好很多。
然后我们进行写入文件
def write_to_file(content):
with open('result.txt','a',encoding='utf-8') as f:#使用utf-8编码格式
print(type(json.dumps(content)))
f.write(json.dumps(content,ensure_ascii=False)+'\n')#防止汉字输入不正确从而变成乱码,我们将ensure_ascii设置为False
这样整个代码就可以写出来了,整体代码如下:
import json
import requests
import requests.exceptions
import re
# 返回单页的信息
def get_single_page(url):
headers = {
'User - Agent': 'Mozilla / 5.0(Windows NT 10.0;'
+ 'WOW64;'
+'rv: 61.0) Gecko / 20100101'
+'Firefox / 61.0'
}
response = requests.get(url)
try:
if (response.status_code == 200):
return response.text
return None
except requests.exceptions.HTTPError:
return None
# 解析页面,用正则表达式获取想要的信息,这里注意的是,千万别用开发者模式查看网页的源码,源码可能和response.text不同
def parse_one_page(html):
pattern = re.compile(
'<dd>.*?board-index.*?>(\d+)</i>' #排名
+'.*?data-src="(.*?)".*?>'#图片
+'.*?title.*?>(.*?)</a>'#电影名
+'.*?star.*?>(.*?)</p>'#主演
+'.*?releasetime.*?>(.*?)</p>'#上映时间
+'.*?integer.*?>(.*?)</i>'#排名整数
+'.*?fraction.*?>(.*?)</i>.*?</dd>'#排名小数
,re.S
)
response = re.findall(pattern,html)
for item in response:
yield {
'index':item[0],
'img':item[1],
'name':item[2],
'star':item[3],
'realeasetime':item[4],
'integer':item[5],
'fraction':item[6]
}
def write_to_file(content):
with open('result.txt','a',encoding='utf-8') as f:#使用utf-8编码格式
print(type(json.dumps(content)))
f.write(json.dumps(content,ensure_ascii=False)+'\n')#防止汉字输入不正确从而变成乱码,我们将ensure_ascii设置为False
def main(url):
html = get_single_page(url)
print(html)
for it in parse_one_page(html):
write_to_file(it)
main('http://maoyan.com/board')