管弦丝竹,余音袅袅


  • 首页

  • 分类

  • 关于

  • 归档

  • 标签

  • 搜索

如何使用grequests 异步IO批量请求

发表于 2017-03-18 | 分类于 spider | 0 comments

python grequests 库的使用记录

  • 简介:

    对于大名鼎鼎的request库相信大家都已经非常熟悉了,不过他有个不好的缺点就是阻塞性IO,在你使用request.get()获取所需要的网页时,除非这个网页下载完成,不然不能进行对新网页的获取;而cup的处理速度远比IO读写的速度快多了,为了充分利用cpu,加快网页爬取速度,这里讲介绍使用异步IO获取网页的grequests库的使用。这两个库都是 kennethreitz开发的,用法非常相似。

  • 安装install
    pip install grequests

  • 基础用法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#要爬取的url集合
urls = [
url = 'https://www.zhihu.com/people/excited-vczh/following',
url = 'https://www.zhihu.com/people/liaoxuefeng/following',
url = 'https://www.zhihu.com/people/hellolin-30/following'
]
#同时将上述请求发送
rs = (grequests.get(u) for u in urls)
#查看发送请求的响应状态码和响应结果:
respond_html=[]
for resp in grequests.map(rs, exception_handler=exception_handler):
# grequests.map可以查看异步io么一个请求返回的状态码200 500
# print('status:{0} url:{1}'.format(resp, resp.url))
if resp is not None:
respond_html.append(resp.text)
else:
continue
  • 异常的处理
1
2
def exception_handler(request, exception):
print('got exception request: {0}, exception {1}'.format(request, exception))
  • 异步IO实际运用效果的反思:

     a.原本毕设在做一个基于python的知乎用户信息特征爬虫系统的,为了加快爬取速度思考使用异步IO,主要思路:                  
    1 对用户信息的的请求入口使用异步IO(grequests)请求多个url地址        
     2 每一个用户关注人又有多个分页,对分页进行异步IO请求。
     原先未使用grequests库,由于阻塞IO的影响,每次只能爬取一个用户信息,再爬取每一用户第一页下的关注人url地址(实际未爬全所有该用户关注的用户);速度爬取相对较快;使用grequests后去爬取某个用户所有分页下的关注人url后,速度开始变慢,主要原因是:在爬取这个用户后,接着要全部爬完和解析所有分页的html(基本爬全所有关注的用户);比如某个用户关注上万人,系统爬取该用户下所有关注人都要耗费大把时间。所以异步IO提速还需要看实际的运用情况和环境。比如本身网络带宽限制,机器硬件限制等等都会影响到整体的速度。
     b.爬取过程的问题:
     虽然该系统只是爬取用户的关注人,不爬取被关注人信息。所以不存在关注和被关注的关系,当是存在 多个人关注同一个人的情况,所以如果爬取所有每个人的关注人,仍然存在爬取了很多重复性爬过的过户,特别是爬取解析分页网页(某个用户关注人特别多的情况);耗费资源时间却做很多无用功。
    个人解决方法:控制爬取的分页数(实际爬去的分页数还需算法和大数据理论支撑),概率性爬取关注人的url(分页下)。存在多人关注同一人的关系便存在概率性爬取到此用户的可能。
     缺点:部分概率爬取不到关注用户;爬取的用户数据不全。
    

    grequets使用代理

    1
    2
    proxies = {'http': 'http://219.148.108.126:8998'}
    s = (grequests.get(u, proxies=proxies) for u in urls)
  • 参考

    • https://pypi.python.org/pypi/grequests
    • https://github.com/kennethreitz/grequests
    • http://blog.upeoe.com/2016/11/24/how-to-use-grequest/

python全局变量

发表于 2017-03-17 | 分类于 python | 0 comments

python全局变量使用:

  • 1 可以直接定义一个globalvar.py文件;里面存放其他文件要使用的变量。在其他文件中导入:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
from src.globalvar import *
# __author_="gLinlf"
# coding=utf-8
import queue
# 定义全局变量
# 已经爬取得到所有url
had_url = set()
# 已经爬取解析用户的url
had_used_url = set()
# 用户关注的其他用户的url 使用队列(使用后删除)
follow_url = queue.Queue(maxsize=0)
# 爬虫入口
# follow_url.put('https://www.zhihu.com/people/liaoxuefeng')
follow_url.put('https://www.zhihu.com/people/competitionlaw')
# 请求头
header = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36'}
# 数据库名
db_name = 'test'
# 抽样爬取不大于10个分页的用户(200人)(加快用户信息爬取速度!概率性减少 花费早爬取页面中存在较多已经爬去的用户url 的资源和时间。)
max_page = int(10)
# 异步IO请求解析的最大页码数
max_parse_page = int(5)
  • 2使用global关键字声明

mongodbengine 使用记录

发表于 2017-03-16 | 分类于 mongodb | 0 comments

mongoengine操作mongodb的使用笔记

参见mongoengine文档

  • 1 安装mongoengine

pip install -U mongoengine

  • 2 在python3.5中创建连接

mongoengine.connect(db = None,alias =’default’,** kwargs )

  • 2.1如果使用的时本地连接,则由’db’参数指定的数据库,直接连接数据库例如:

mongoengine.connect(‘testdb’)

  • 2.2如果数据库不在localhost的默认端口上运行,也可以在此处提供连接设置(如果需要验证,请提供用户名和密码参数。):
1
mongoengine.register_connection(alias,name = None,host = None,port = None,read_preference = Primary(),username = None,password = None,authentication_source = None,authentication_mechanism = None,** kwargs )
  • 参数:

    alias - 将用于在MongoEngine中引用此连接的名称
    name - 要使用的特定数据库的名称
    host - 要连接的mongod实例的主机名
    port - mongod实例正在运行的端口
    read_preference - 集合的读取首选项**添加pymongo 2.1
    username - 要进行身份验证的用户名
    密码 - 要验证的密码
    authentication_source - 要进行身份验证的数据库
    authentication_mechanism - 数据库认证机制。默认情况下,对MongoDB 3.0及更高版本使用SCRAM-SHA-1,对较旧的服务器使用MONGODB-CR(MongoDB Challenge Response协议)。
    is_mock - 明确使用mongomock进行连接(也可以使用mongomock://作为db主机前缀)
    kwargs - 要传递到pymongo驱动程序的特定参数,例如maxpoolsize,tz_aware等。有关完整列表,请参阅pymongo的MongoClient文档。
    

mongoengine在python中的基本使用:

新增(save)

  • 创建py文件testmongo.py 类为TestCategories ,TestCategories类似存入mongodb数据库中的表:

    import mongoengine
    class TestCategories(mongoengine.Document):
        # 用户信息地址
        user_url = mongoengine.StringField()
        # 用户名
        user_name = mongoengine.StringField()
        # 用户居住所在地
        user_locations = mongoengine.ListField()
    
  • 在另一个py文件创建一个测试文件 test.py:

    from src.testmogo import TestCategories
    from mongoengine import *
    connect('test')
    cate = TestCategories()
    cate.user_url = 'hello'
    cate.user_name= 'python'
    cate.user_locations = ['llf']
    cate.save()
    
  • 执行 test.py文件查看 数据库结果:

查询

对于objects的到只是一个queryset类(QuerySet),这类里面有丰富的信息,存放所有查询到的 document对象(TestCategories)的list集合。可以使用for in list 语法将查询到的类对象里的数据灵活拼接成一个新的dict或list。

参考:Python中QuerySet和Objects类

obj = TestCategories.objects(user_url='123')
#<class 'mongoengine.queryset.queryset.QuerySet'>
print(type(obj))
#<TestCategories:TestCategoriesobject>
print(obj)
for i in obj:
    print(i.user_url)

更新

安装 django的web框架后 有update()等方法。

obj = TestCategories.objects(user_url='123')获得的就是对应的document。
obj.user_url = '321'
obj.update()

常规更新:

obj = TestCategories.objects(user_url='123')
#<class 'mongoengine.queryset.queryset.QuerySet'>
print(type(obj))
#[<TestCategories: TestCategories object>, <TestCategories: TestCategories object>]
print(obj)
for obj in objs:
    print(obj.user_url)
    # 直接操作 obj(TestCategories)对象 ,修改对应的字段值,更新!
    obj.user_name = 'xx'
    obj.save()

删除

How to use selenium

发表于 2017-03-13 | 分类于 spider | 0 comments

python 异步爬取库selenium使用记录

简介

  • 1 在做基于python的知乎用户信息特征爬虫系统中,遇到了个人信息需要点击 查看详细资料后 页面才能渲染出所有我所需要的用户信息。对于基于异步请求的动态网页爬虫,在研究了相关资料后发现这个暴力牛逼的包selenium,相对简单实用。简单来说就是模拟人为对浏览器的动作,比如:点击事件,填写表单等。这样就能克服操作我们传统爬虫只能爬取静态网页,得不到异步请求渲染后的网页信息。具体安装如下:

    安装selenium(python3.5,window10环境下)

  • 1.通过pip安装

pip install selenium

  • 2.通过下载selenium安装包

    selenium连接
    https://pypi.python.org/pypi/selenium
    解压,cmd进入目录:
    E:\selenium\selenium2.53.5> python3 setup.py install

安装浏览器驱动chromedriver(以google为例)

  • 1.下载Chromedriver

    下载地址:http://chromedriver.storage.googleapis.com/index.html
    注意:先查看notes.txt,Chromedriver版本和浏览器版本一定要对应。否者会出现各种异常报错。

  • 2.解压chromedriver.zip文件
    将里面的chromedriver.exe文件拷贝到谷歌浏览器的安装目录下:

    C:\Program Files (x86)\Google\Chrome\Application

  • 3.配置环境变量

    打开:我的电脑->属性->高级系统设置->环境变量
    打开path
    在最后面添加 ;C:\Program Files (x86)\Google\Chrome\Application

    1. 测试

      打开python编辑器 如pyCharm 编辑代码:

      chromedriver = “C:\Program Files (x86)\Google\Chrome\Application\chromedriver.exe”
      os.environ[“webdriver.chrome.driver”] = chromedriver
      driver = webdriver.Chrome(chromedriver)
      driver.get(‘http://www.baidu.com‘)

      如果跳出google浏览器,且为百度页面则安装成功。不知道为什么其他博客只需要:

      driver = webdriver.Chrome()
      driver.get(‘http://www.baidu.com‘)

便能成功。而且我环境变量也已经配置。不知道啥原因,有待研究下。

———————————————————————————————

selenium使用记录

模拟知乎登录(具体使用查看文档)

  • 引用链接:
    https://www.zhihu.com/question/46528604?sort=created
  • ###a先实例化一个driver

    chrome_driver = “C:\Program Files (x86)\Google\Chrome\Application\chromedriver.exe”

    os.environ["webdriver.chrome.driver"] = chrome_driver
    driver = webdriver.Chrome(chrome_driver)
    
  • ###b 登录知乎,亲自测试可行:

    driver.get(“http://www.zhihu.com“) #打开知乎我们要登录
    time.sleep(2) #让操作稍微停一下
    driver.find_element_by_link_text(‘登录’).click() #找到‘登录’按钮并点击
    time.sleep(2) # 找到输入账号的框,并自动输入账号 这里要替换为你的登录账号
    driver.find_element_by_name(‘account’).send_keys(‘你的账号’)
    time.sleep(2)# 密码,这里要替换为你的密码
    driver.find_element_by_name(‘password’).send_keys(‘你的密码’)
    time.sleep(2)# 输入浏览器中显示的验证码,这里如果知乎让你找烦人的倒立汉字,手动登录一下,再停止程序,退出#浏览器,然后重新启动程序,直到让你输入验证码
    yanzhengma=input(‘验证码:’) #现在好像不需要验证码
    driver.find_element_by_name(‘captcha’).send_keys(yanzhengma) # 找到登录按钮,并点击
    driver.find_element_by_css_selector(‘div.button-wrapper.command > button’).click()

  • ###c 使用driver.page_source 可以获得实际操作后的页面源码。而requests库只能获得打开连接的静态网页。
    如:html = driver.page_source
    接下来就可以使用BeautifulSoup库来自由操作了。
123
glinlf

glinlf

心之所向 步履维艰

24 日志
11 分类
34 标签
© 2017 glinlf
由 Hexo 强力驱动
主题 - NexT.Pisces