12个Python爬虫技巧分享

Posted 黑马程序员官方

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了12个Python爬虫技巧分享相关的知识,希望对你有一定的参考价值。

1、使用requests库发送HTTP请求:requests库是Python中最常用的HTTP库之一,它提供了许多方便的方法来发送HTTP请求和处理响应。

2、解析HTML和XML文档:Python中常用的解析库有BeautifulSoup和lxml等,它们可以帮助你轻松地解析html和XML文档。

3、使用正则表达式提取数据:如果要从一段文本中提取特定的数据,可以使用Python的re模块,它提供了处理正则表达式的方法。

4、使用XPath和CSS选择器提取数据:XPath和CSS选择器是两种常用的选择器,它们可以在HTML和XML文档中选择特定的元素和属性。

5、处理动态内容:如果网站使用javascript来呈现内容,可以使用Selenium等工具来模拟浏览器行为,从而抓取动态生成的内容。

6、使用代理和用户代理:使用代理可以避免被网站封禁IP,使用用户代理可以模拟不同的浏览器和设备类型。

7、处理Cookie和Session

如果要登录网站或保持会话状态,可以使用Cookie和Session机制。

cookies是某些网站为了辨别用户身份、进行session跟踪而储存在用户本地终端上的数据(通常经过加密),python提供了cookielib模块用于处理cookies,cookielib模块的主要作用是提供可存储cookie的对象,以便于与urllib2模块配合使用来访问Internet资源.

import urllib2, cookielib
 
cookie_support= urllib2.HTTPCookieProcessor(cookielib.CookieJar())
opener = urllib2.build_opener(cookie_support)
urllib2.install_opener(opener)
content = urllib2.urlopen('http://XXXX').read()

关键在于CookieJar(),它用于管理HTTP cookie值、存储HTTP请求生成的cookie、向传出的HTTP请求添加cookie的对象。整个cookie都存储在内存中,对CookieJar实例进行垃圾回收后cookie也将丢失,所有过程都不需要单独去操作。

手动添加cookie

cookie = "phpSESSID=91rurfqm2329bopnosfu4fvmu7; kmsign=55d2c12c9b1e3; KMUID=b6Ejc1XSwPq9o756AxnBAg="
request.add_header("Cookie", cookie)

8、处理异常和错误:在爬取网站时,可能会遇到各种异常和错误,例如网络连接失败、响应超时等,需要及时处理。

 

9、遵守爬虫协议:为避免对网站造成过度负荷或滥用,需要遵守Robots协议和网站的使用条款。

10、数据存储和处理:需要将抓取的数据存储到数据库或文件中,并进行必要的处理和分析。常用的数据库包括mysql、MongoDB和SQLite等,常用的数据处理库包括Pandas和NumPy等。

11、页面解析

对于页面解析最强大的当然是正则表达式,这个对于不同网站不同的使用者都不一样,就不用过多的说明,附两个比较好的网址:

正则表达式入门:Python正则表达式指南 - AstralWind - 博客园

正则表达式在线测试:在线正则表达式测试

其次就是解析库了,常用的有两个lxml和BeautifulSoup,对于这两个的使用介绍两个比较好的网站:

lxml:Python爬虫:Xpath语法笔记 - j_hao104的个人页面 - OSCHINA - 中文开源技术交流社区

BeautifulSoup:Python爬虫利器二之Beautiful Soup的用法

12、多线程并发抓取

单线程太慢的话,就需要用多线程了,这里给大家简单的线程池模板,这个程序只是简单地打印了1-10,但是可以看出是并发的。

虽然说python的多线程很鸡肋,但是对于爬虫这种网络频繁型,还是能一定程度提高效率的。

from threading import Thread
from Queue import Queue
from time import sleep
# q是任务队列
#NUM是并发线程总数
#JOBS是有多少任务
q = Queue()
NUM = 2
JOBS = 10
#具体的处理函数,负责处理单个任务
def do_somthing_using(arguments):
    print arguments
#这个是工作进程,负责不断从队列取数据并处理
def working():
    while True:
        arguments = q.get()
        do_somthing_using(arguments)
        sleep(1)
        q.task_done()
#fork NUM个线程等待队列
for i in range(NUM):
    t = Thread(target=working)
    t.setDaemon(True)
    t.start()
#把JOBS排入队列
for i in range(JOBS):
    q.put(i)
#等待所有JOBS完成
q.join()

以上是关于12个Python爬虫技巧分享的主要内容,如果未能解决你的问题,请参考以下文章

Python | 8个常用的爬虫技巧总结

Python爬虫零基础到进阶(大纲)

刚入门Python的小伙伴,这是腾讯大牛工作中总结的爬虫经验!

分享Python7个爬虫小案例(附源码)

Python爬虫:一些常用的爬虫技巧总结

简单python爬虫练习 E站本爬取