import requests
from requests.exceptions import RequestException
from multiprocessing import pool
import multiprocessing
import re
import json
def get_page(url):
try:
User_Agent ='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.113 Safari/537.36'
headers = {"User-Agent": User_Agent,
"Accept": 'image/webp,image/*,*/*;q=0.8',
'Referer': 'http://maoyan.com/board/4',
}
response = requests.get(url, headers=headers)
if response.status_code == 200:
# print(response.text)
return response.text
return None
except RequestException:
return None
def parse_one_page(html):
pattern=re.compile('<dd>.*?board-index.*?>(\d+)</i>.*? data-src="(.*?)".*?</a>.*?<a href.*?>(.*?)</a></p>.*?<p class="star">(.*?)</p>'
+'.*?<p class="releasetime">(.*?)</p>.*?<i class="integer">(.*?)</i><i class="fraction">(.*?)</i>',re.S)
items = re.findall(pattern, html)
for item in items:
yield {
'index':item[0],
'img':item[1],
'title':item[2],
'actor':item[3].strip()[3:],
'time':item[4].strip()[5:],
'grade':item[5]+item[6]
}
return
def write_to_file(content):
with open('resule.txt','a',encoding='utf-8') as f:
f.write(json.dumps(content,ensure_ascii=False)+'\n')
f.close()
def main(offset):
url = 'http://maoyan.com/board/4?offset=' + str(offset)
html = get_page(url)
for item in parse_one_page(html):
write_to_file(item)
print(item)
if __name__ == "__main__":
pools=multiprocessing.pool.Pool()
pools.map(main,[i*10 for i in range(10)])
# for offset in range(10):
今天学习了从猫眼网址爬去排名前一百的电影,代码很简单,但是在看完视频之后,自己写的过程中还是遇到挺多的问题。
1.跟视频一样直接用requests.get()直接访问网页,然后被检测出来了。后来加了User-Agent就可以了。但是发现网页的内容却和电脑浏览器的不一样。一直在查找错误。因为在粘贴User_Agent的时候有稍微瞄了一下,看到了Android的字眼,然后在前几天在查过User-Agent是什么东西。是告诉服务端你的浏览器是什么型号版本还有你的操作系统信息。我就觉得是这里出现的问题,后来把User_Agent改了,就可以访问到页面的HTML代码了。User_Agent是告诉服务器你用的是什么操作系统和什么浏览器,服务器会根据这个信息返回相应的网页。比如你是Android系统的他会返回适应手机屏幕的网页,微软就适合电脑的网页
2.在写正则表达式的时候,觉得自己写的是没有问题的,还是配的时候没有结果。后来粘贴了视频上面的代码,结果可以了。但是我看了代码,觉得他的代码才是有问题的。但是他的代码却可以匹配出来,那问题肯定出现在我这里。我把访问的页面HTML打印出来,在浏览器的控制台进行对比,发现浏览器控制台的标签跟打印出来是不一样的,我配正则表达式的时候是看浏览器的,结果匹配错了,后来按照打印出来的匹配就成功了(按F12看的HTML代码有时候会跟你右键查看网页源代码不一样)
3.然后照着视频进行多线程的爬虫,在调用Pool()函数的时候出现了问题。后来再百度上看到Pool是一个类,最终通过multiprocessing.pool.Pool()完成的。
4.之前在import 包的时候,总是灰色的,不知道为什么吗,今天才知道因为你引用了包,但是还没有调用里面的东西所有才是灰色的,有用到里面的东西就不会呈现灰色代码
整个项目的流程思路:
先直接访问电影前一百的网页,访问的时候需要加上Header才能够访问,判断是否访问网页成功,加处理异常。
然后查看元素进行定位,用正则表达式匹配出要检索的信息。打印到TXT文件中
采用多线程搜索