初级的爬虫,此处不涉及其他解析工具,用的是正则表达式,因为这个是必须要学的,请求网页用的是requests库。
#首先导入json、requests、re、time等模块,此处还用到了异常处理。
import json
import requests
from requests.exceptions import RequestException
import re
import time
#首先定义一个方法,将网页源码的请求头信息加入,此处用到了异常处理机制try和except,判断状态码,200就是响应成功的意思,最后返回响应信息。
def get_one_page(url):
try:
#请求头的信息可以在网页源代码中找到
headers = {
'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36'
}
response = requests.get(url, headers=headers)
#此处判断响应的状态码
if response.status_code == 200:
return response.text
return None
except RequestException:
return None
#这里我们再定义一个方法,这个方法中用到的就是正则表达式,用于匹配你上文中接收到的源码信息,解析出你想要的东西,再加入一个生成器,依次输出得到的结果。
def parse_one_page(html):
#正则表达式匹配,我们首先要定义一个正则匹配的方法,然后下面用到的findall中传入的参数,第一个是我们定义的正则匹配方法,第二个就是我们爬下来的源代码
pattern = re.compile('<dd>.*?board-index.*?>(\d+)</i>.*?data-src="(.*?)".*?name"><a'
+ '.*?>(.*?)</a>.*?star">(.*?)</p>.*?releasetime">(.*?)</p>'
+ '.*?integer">(.*?)</i>.*?fraction">(.*?)</i>.*?</dd>', re.S)
items = re.findall(pattern, html)
#此处是一个生成器
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]
}
#我们将匹配好的内容写入文件,ensure_ascii=False用于保证输出的是中文而不是unicode编码。json库的dumps()方法实现字典序列化
def write_to_file(content):
with open('result.txt', 'a', encoding='utf-8') as f:
f.write(json.dumps(content, ensure_ascii=False) + '\n')
#这里我们可以看到,猫眼电影在翻页的时候,它的url除了最后一个offset在变,前面的都没有变,所以此处可以在url后面加一个offset变量,用于翻页。
def main(offset):
url = 'http://maoyan.com/board/4?offset=' + str(offset)
html = get_one_page(url)
for item in parse_one_page(html):
print(item)
write_to_file(item)
#由于猫眼电眼的一页只展示10部电影,所以我们要做一个for循环,最后执行。
if __name__ == '__main__':
for i in range(10):
main(offset=i * 10)
time.sleep(1)