您的位置:首页 > 运维架构

Re+Selenium新手爬取猫眼Top 100

2017-12-04 22:38 253 查看
看完了视频后,照猫画虎的把源码写了,有不懂的地方做了注释,以后还是把知识点或者难的地方写在博客上,也方便查询一些,上次的.format运算当时记得住现在就忘了,结果在写进程池之前只能用最弱智的for循环。。。

对于源代码的爬取,猫眼有最初级的反爬取措施,所以无法直接用request来进行解析,所以用了之前看到的selenium库来得到源码,其实这些用美丽汤很好写,但是也算是练习Re了。

下面是代码

from selenium import  webdriver#引入浏览器对象
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver import ActionChains#交互动作,如拖拽
import time
from multiprocessing import Pool
import re
import json

def get_one_page(url):#得到网页源代码
try:
browser = webdriver.Chrome("C:\Program Files (x86)\Google\Chrome\Application\chromedriver.exe")
browser.get(url)
return browser.page_source
finally:
browser.close()

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)#匹配正则表达式
items=re.findall(pattern,html)
for item in items:#yield的用法,函数生成器的用法
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]
}

def write_to_file(content):
with open('C:/Users/张启航/Desktop/res.txt','a',encoding='utf-8') as f:
f.write(json.dumps(content,ensure_ascii=False)+'\n')# dumps是将字典(dict)格式转化成字符串(str)格式
f.close()

def main(offset):#对单个给定offset的网页进行读取
url = 'http://maoyan.com/board/4?offset='+str(offset)
print(url)#测试网址输出是否正确
the_source=get_one_page(url)
for item in parse_one_page(the_source):
write_to_file(item)

if __name__=='__main__':
pool=Pool()#引入进程池,加快程序
pool.map(main,[i*10 for i in range(10)])


主要有几个部分,因为python是大一学的,而且学的很水,所以不扎实,比如.format和yield(函数生成器),另外json之前也没接触过。写完这篇之后,我会把这三个点重新写一下,当作积累。在学习爬虫之余顺便把python有意思的地方再来一遍。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  爬虫入门