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爬虫技巧分享的主要内容,如果未能解决你的问题,请参考以下文章