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(
'.*?board-index.*?>(\d+).*? data-src="(.*?)".*?.*?(.*?).*?(.*?)
'
+
'.*?(.*?)
.*?(.*?)(.*?)'
,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文件中
采用多线程搜索