初级的爬虫,此处不涉及其他解析工具,用的是正则表达式,因为这个是必须要学的,请求网页用的是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)