首先要下载相应的库

gevent协程库:pip install gevent

selenium模拟浏览器访问库:pip install selenium

selenium库相应驱动配置  https://www.cnblogs.com/Niuxingyu/p/10490882.html

#导包
import gevent
#猴子补丁
from gevent import monkey
monkey.patch_all()
import requests
import os
import re
from lxml import etree
#模拟浏览器行为
from selenium import webdriver #定义全局变量
global_url_list = [] #定义类
class GeventSpider(object):
#定义类属性
encloseing_url_list = [] #定义抓取方法
def run(self,url):
# 抓取写文件
if url == 'http://military.cctv.com/' :
file_name = 'test_cctv.html'
else:
file_name = 'inner_cctv.html'
html_content = ''
if not os.path.exists(file_name) :
#定义浏览器对象
browser = webdriver.Chrome()
browser.get(url)
#解码赋值
html = browser.page_source.encode('utf-8').decode()
time.sleep(1)
#解码
# html = r.content.decode('utf-8')
#写文件 指定文件编码
with open('./'+file_name,'w',encoding='utf-8') as f:
f.write(html)
#关闭浏览器
browser.quit()
html_content = html
else:
#读取文件返回
with open('./'+file_name,encoding='utf-8') as f:
content = f.read()
html_content = content
self.get_xpath(html_content) #定义数据匹配方法
def get_xpath(self,html):
#转换格式
html = etree.HTML(html)
#匹配url
html_data_url = html.xpath('//span[@class="l"]/a/@href')
#声明修改全局变量
global global_url_list
global_url_list = html_data_url
#修改类属性
self.encloseing_url_list = html_data_url #定义爬取内页逻辑
def get_inner(self,url):
#发送请求
r = requests.get(url)
html = r.content.decode('utf-8')
#正则匹配标题
regex = re.compile('<h1>(.+?)</h1>',re.I)
print(regex.findall(html)) if __name__ == "__main__":
#实例化一个对象
geventspider = GeventSpider()
#定义一个urllist
url_list = ['http://military.cctv.com/'] #请求首页没必要开协程
geventspider.run(url_list[0]) #重新赋值 使用协程同时爬取十四个内页 其实这里我们做了两种方法一个使用类属性赋值,还可以使用我们定义好的全局变量global_url_list来进行赋值
url_list = geventspider.encloseing_url_list
#url_list = global_url_list
#列表推倒式将所有创建好的协程写入列表
job_list = [gevent.spawn(geventspider.get_inner,item) for item in url_list]
#阻塞协程 等待所有协程完成后在进行关闭
gevent.joinall(job_list)

最新文章

  1. C# Interface的使用方法探讨
  2. Oracle手工创建数据库
  3. IE6下png格式图片显示问题
  4. Java反射实战
  5. android 入门-动画与容器
  6. HDU2829 Lawrence(斜率优化dp)
  7. FZU 2129 子序列个数
  8. 【转】Java集合框架List,Map,Set等全面介绍
  9. Swift应用开源项目推荐
  10. 你不知道的Eclipse用法:使用Allocation tracker跟踪Android应用内存分配
  11. js 正则,从url中取参数值
  12. Tensorflow之MNIST机器学习入门
  13. python数据分析工具包(3)——matplotlib(一)
  14. 使用uiautomator2进行webview页面的测试
  15. jTimer
  16. eclipse的安装和汉化
  17. 微商城分享 包括app分享 微信分享
  18. SpringCloud初体验之Eureka
  19. css3-盒模型新增属性
  20. Oracle 11g EM删除重建的方法

热门文章

  1. C++多态(静多态和动多态)
  2. mac下virtualbox中centos6.5虚拟机实现全屏和调整分辨率
  3. VUE 处理文本框获焦点高亮
  4. Flutter的Appbar
  5. python爬虫之pandas
  6. composer 下载包慢的解决方法
  7. 关于@Param
  8. log4j2.xml
  9. vue 思維導圖
  10. Lodop控件NewPage();测试输出空白页