爬取思路
当我们想要爬取一个页面的时候,我们要保证思路清晰,爬虫的思路分四个步骤,发起请求,获取响应内容,解析内容,存储内容。根据这四个内容我们的思路就很清晰。以下为具体步骤
- 使用requests库爬出单页内容
- 根据返回值使用正则表达式分析
- 保存至文件
- 对目标网站进行循环以及多线程爬取
项目实战部分
-
使用requests库爬出单页内容
爬取url:http://maoyan.com/board/4?
猫眼对爬虫有一个反爬虫策略,如果请求头没有模仿为浏览器的请求头会出现禁止访问,所以这里我们设置请求头。
# 获取页面 def get_one_page(url): # 反爬虫,设置用户请求头 header = { 'User-Agent' : "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36" } # 得到网页地址的内容 try: response = requests.get(url,headers = header) if response.status_code == 200: return response.text return None except RequestException: return None
-
根据返回值使用正则表达式分析
上一步,我们通过requests库爬取目标网页的所有内容,可是我们需要的是去除HTML标签后的部分信息,怎么办呢,正则表达式派上用场了。这部分主要是正则表达式的书写,所以学会爬虫,一个重要的点就是正则表达式,使用正则匹配完页面所有的相符合内容后,使用yield生成器对正则匹配到的信息进行处理。
# 解析页面 def parse_one_page(html): pattern = re.compile('<dd>.*?board-index.*?>(\d+)</i>.*?data-src="(.*?)".*?name"><a.*?>(.*?)</a>' '.*?star">(.*?)</p>.*?releasetime">(.*?)</p>.*?integer">(.*?)</i>.*?fraction">' '(.*?)</i>.*?</dd>',re.S) itmes = re.findall(pattern,html); for itme in itmes: yield { 'index': itme[0], 'image': itme[1], 'title': itme[2], 'actor': itme[3].strip()[3:], 'time': itme[4].strip()[5:], 'score': itme[5]+itme[6] } # print(itmes)
-
保存至文件
对目标网页的信息处理完成后,我们就需要将其存储到一个文件中,存储为.txt文件,并将编码格式为utf-8,存储完成后关闭文件。
# 存储数据 def write_to_file(content): # a参数代表往后追加 with open('result.txt','a', encoding= 'utf-8') as f: # 一个content代表一个item,后面要换行 f.write(json.dumps(content, ensure_ascii=False) + '\n') f.close()
我们就可以看到result.txt文件,打开文件我们可以看到爬取的排名。
-
对目标网站进行循环以及多线程爬取
最后就是对网站进行循环爬取了,到目前为止,我们只是爬取一个页面,只有10个数据,我们分析下从第一页到最后一页的地址变化
http://maoyan.com/board/4?offset=90,我们可以发现offset参数是翻页地址的变化原因,这样我们就可以得到从第一页到最后一页的地址。
# offset设置爬取下一页 def main(offset): url = 'http://maoyan.com/board/4?offset=' + str(offset) html = get_one_page(url) # print(html) for item in parse_one_page(html): write_to_file(item) print(item) # 多线程爬取 if __name__ == '__main__': # for i in range(10): # main(i*10) pool = Pool() pool.map(main,[i*10 for i in range(10)])
好了,使用requests库+正则表达式爬取猫眼电影top100完成了,其实很简单,只要我们多动手做做,多分析具体网址,基本就可以将我们想爬取的网站爬取。