博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Python多线程爬取猫眼网站榜单TOP100,并存入CSV文件!
阅读量:3961 次
发布时间:2019-05-24

本文共 2875 字,大约阅读时间需要 9 分钟。

Python爬取猫眼网站榜单TOP100,并存入CSV文件!

1. 目标网址

看到榜单的时候网址是https://maoyan.com/board/4是这样的,通过下一页看到https://maoyan.com/board/4?offset=10,然后在下一页https://maoyan.com/board/4?offset=20,所以得到规律,其实首页也可以这样访问https://maoyan.com/board/4?offset=0
欧阳天虹
2. 请求网页,出现的问题
一定要记得带请求头,因为现在的网站反爬虫机制还是挺厉害的,必须模仿浏览器访问,针对一些网站访问的时候必须请求头,不要因为坏毛病不带请求头,在编写代码的时候我没带请求头只能访问到猫眼网站的详情页,害我找了半天的毛病的,并且控制台的打印的字符简直看不清楚,如下图。然后呢,还有一个问题,如果你用自己的浏览器的请求头的访问还是详情页,建议去找哈其他浏览器的请求头,这里我用的极速浏览器的请求头只能访问详情页,应该是浏览器的内核问题,换成谷歌,火狐浏览的请求头也就可以了。
在这里插入图片描述

3. 编写代码

这里我用的parsel库,这个库解析的网页支持xpath,css,re正则,提取网页元素,感觉这个库挺好用的,值得推荐。
在存储数据的时候,遇到一些问题想使用pandas的DataFarms来直接导出数据这样也就很方便了,但是我发现不能追加数据在同一张表上(应该是可以的,我对这个库不太熟悉),然后就用了下面的这个方法两次操作同一个CSV文件也达到了了预期的效果,就是感觉这办法挺生硬的,简单的来说第一次打开文件进行第一行的字段说明写入,然后第二次打开文件对数据的追加写入,所以存在两个with open()。

# -*- coding: utf-8 -*-#@Project filename:PythonDemo  MaoyanTOP100.py#@IDE   :IntelliJ IDEA#@Author :ganxiang#@Date   :2020/03/21 0021 09:36import parselimport requestsimport csvfrom concurrent.futures import ThreadPoolExecutor,wait,ALL_COMPLETEDimport timedef parse_html(url,i):    # url ="https://maoyan.com/board/4?offset=10"    headers = {
'User-Agent':"Mozilla/5.0 (Windows NT 10.0; WOW64; rv:38.0) Gecko/20100101 Firefox/38.0" } res =requests.get(url,headers=headers) # print(res.text) sels=parsel.Selector(res.text)##解析网页 texts =sels.css("dd")#css定位到存放电影标签的上级标签 with open("./SaveData/maoyanTOP100.csv",'a+',newline="")as f: write =csv.writer(f) for sel in texts: title=sel.css('p.name a::text').getall()[0]#getall()以列表的形式返回所有数据,get()返回一个数据 href=sel.css('p.name a::attr(href)').getall()[0] actor =sel.css('p.star ::text').getall()[0].strip() show_time =str(sel.css('p.releasetime ::text').getall()[0]).replace("上映时间:","") score ="".join(sel.css('p.score i::text').getall()) row =[str(i),str(title),"https://maoyan.com"+str(href),actor,show_time,score] write.writerow(row) print(i,title,"https://maoyan.com"+str(href),actor,show_time,score) i+=1def run(): t1 =time.time() with open("./SaveData/maoyanTOP100.csv",'w',newline="")as f: header=["rank","电影名","电影链接","演员","上映时间","评分"] write=csv.writer(f) write.writerow(header) #1,不使用多线程执行程序 # for i in range(0,110,10): # url ="https://maoyan.com/board/4?offset={}".format(i) # parse_html(url,i+1) #2,使用多线程执行程序 executor =ThreadPoolExecutor(max_workers=3)#设置线程个数 # submit()的参数:第一个为函数,其他是为该函数的传入参数,允许有多个 tasks =[executor.submit(parse_html,"https://maoyan.com/board/4?offset={}".format(url),url)for url in range(0,110,10)] wait(tasks, return_when=ALL_COMPLETED)# 等待所有的线程完成,才进入后续的执行 t2=time.time() print("使用线程的时间为:",t2-t1)#使用线程的时间为: 1.9762754440307617 # print("不使用线程的时间为:",t2-t1)#不使用线程的时间为: 7.454896450042725if __name__ =='__main__': run()

4. 效果如图

在这里插入图片描述

5.csv中展示

在这里插入图片描述

欧克啦

转载地址:http://weqzi.baihongyu.com/

你可能感兴趣的文章
涨姿势了:求两个分子的最大公倍数
查看>>
快速幂
查看>>
vector.reserve and resize &&vector与map结合
查看>>
最长公共子序列
查看>>
计算几何
查看>>
求解方程
查看>>
太弱了。。水题
查看>>
位运算(含应用)
查看>>
野指针与空指针
查看>>
图文混排效果
查看>>
urllib2.urlopen超时问题
查看>>
魏兴国:深入浅出DDoS攻击防御
查看>>
使连续的参考文献能够中间用破折号连起来
查看>>
Discover Feature Engineering, How to Engineer Features and How to Get Good at It
查看>>
36辆车,6条跑道,无计时器,最少几次比赛可以选出前三
查看>>
matlab2012b与matlab7.1执行set(gca,'Yscale','log')之后画到的直方图结果居然不同
查看>>
回文题
查看>>
AJAX应用之注册用户即时检测
查看>>
File 类小结
查看>>
java除去字符串空格
查看>>