热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

了解这8个常用技巧后,让你零基础学Python爬虫更简单![Python常见问题]

python作为一门高级编程语言,它的定位是优雅、明确和简单。我学用python差不多一年时间了,用得最多的还是各类爬虫脚本:写过抓代理本机验证的脚本,写过论坛中自动登录自动发贴的

了解这8个常用技巧后,让你零基础学Python爬虫更简单![Python常见问题]

python作为一门高级编程语言,它的定位是优雅、明确和简单。我学用python差不多一年时间了,用得最多的还是各类爬虫脚本:写过抓代理本机验证的脚本,写过论坛中自动登录自动发贴的脚本,写过自动收邮件的脚本,写过简单的验证码识别的脚本。

这些脚本有一个共性,都是和web相关的,总要用到获取链接的一些方法,故累积了不少爬虫抓站的经验,在此总结一下,那么以后做东西也就不用重复劳动了。

1、基本抓取网页

get方法

import urllib2

url = "http://www.baidu.com"

respOnse= urllib2.urlopen(url)

print response.read()

post方法

import urllib

import urllib2

url = "http://abcde.com"

form = {"name":"abc","password":"1234"}

form_data = urllib.urlencode(form)

request = urllib2.Request(url,form_data)

respOnse= urllib2.urlopen(request)

print response.read()

2.使用代理服务器

这在某些情况下比较有用,比如IP被封了,或者比如IP访问的次数受到限制等等。

import urllib2

proxy_support = urllib2.ProxyHandler({"http":"http://XX.XX.XX.XX:XXXX"})

opener = urllib2.build_opener(proxy_support, urllib2.HTTPHandler)

urllib2.install_opener(opener)

cOntent= urllib2.urlopen("http://XXXX").read()

3.COOKIEs处理

import urllib2, COOKIElib

COOKIE_support= urllib2.HTTPCOOKIEProcessor(COOKIElib.COOKIEJar())

opener = urllib2.build_opener(COOKIE_support, urllib2.HTTPHandler)

urllib2.install_opener(opener)

cOntent= urllib2.urlopen("http://XXXX").read()

是的没错,如果想同时用代理和COOKIE,那就加入proxy_support然后operner改为

opener=urllib2.build_opener(proxy_support, COOKIE_support, urllib2.HTTPHandler)

4.伪装成浏览器访问

某些网站反感爬虫的到访,于是对爬虫一律拒绝请求。这时候我们需要伪装成浏览器,这可以通过修改http包中的header来实现:

headers = {

"User-Agent":"Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.1.6) Gecko/20091201 Firefox/3.5.6"

}

req = urllib2.Request(

url = "http://secure.verycd.com/signin/*/http://www.verycd.com/",

data = postdata,

headers = headers

)

5、页面解析

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

其次就是解析库了,常用的有两个lxml和BeautifulSoup。

对于这两个库,我的评价是,都是HTML/XML的处理库,Beautifulsoup纯python实现,效率低,但是功能实用,比如能用通过结果搜索获得某个HTML节点的源码;lxmlC语言编码,高效,支持Xpath。

6.验证码的处理

碰到验证码咋办?这里分两种情况处理:

google那种验证码,没办法。

简单的验证码:字符个数有限,只使用了简单的平移或旋转加噪音而没有扭曲的,这种还是有可能可以处理的,一般思路是旋转的转回来,噪音去掉,然后划分单个字符,划分好了以后再通过特征提取的方法(例如PCA)降维并生成特征库,然后把验证码和特征库进行比较。这个比较复杂,这里就不展开了,具体做法请弄本相关教科书好好研究一下。

7. gzip/deflate支持

现在的网页普遍支持gzip压缩,这往往可以解决大量传输时间,以VeryCD的主页为例,未压缩版本247K,压缩了以后45K,为原来的1/5。这就意味着抓取速度会快5倍。

然而python的urllib/urllib2默认都不支持压缩,要返回压缩格式,必须在request的header里面写明’accept-encoding’,然后读取response后更要检查header查看是否有’content-encoding’一项来判断是否需要解码,很繁琐琐碎。如何让urllib2自动支持gzip, defalte呢?

其实可以继承BaseHanlder类,然后build_opener的方式来处理:

import urllib2

from gzip import GzipFile

from StringIO import StringIO

class ContentEncodingProcessor(urllib2.BaseHandler):

"""A handler to add gzip capabilities to urllib2 requests """

# add headers to requests

def http_request(self, req):

req.add_header("Accept-Encoding", "gzip, deflate")

return req

# decode

def http_response(self, req, resp):

old_resp = resp

# gzip

if resp.headers.get("content-encoding") == "gzip":

gz = GzipFile(

fileobj=StringIO(resp.read()),

mode="r"

)

resp = urllib2.addinfourl(gz, old_resp.headers, old_resp.url, old_resp.code)

resp.msg = old_resp.msg

# deflate

if resp.headers.get("content-encoding") == "deflate":

gz = StringIO( deflate(resp.read()) )

resp = urllib2.addinfourl(gz, old_resp.headers, old_resp.url, old_resp.code)  # "class to add info() and

resp.msg = old_resp.msg

return resp

# deflate support

import zlib

def deflate(data):  # zlib only provides the zlib compress format, not the deflate format;

try:              # so on top of all there"s this workaround:

return zlib.decompress(data, -zlib.MAX_WBITS)

except zlib.error:

return zlib.decompress(data)

然后就简单了,

encoding_support = ContentEncodingProcessor

opener = urllib2.build_opener( encoding_support, urllib2.HTTPHandler )

#直接用opener打开网页,如果服务器支持gzip/defalte则自动解压缩

cOntent= opener.open(url).read()

8、多线程并发抓取

单线程太慢的话,就需要多线程了,这里给个简单的线程池模板 这个程序只是简单地打印了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()

9. 总结

阅读Python编写的代码感觉像在阅读英语一样,这让使用者可以专注于解决问题而不是去搞明白语言本身。Python虽然是基于C语言编写,但是摒弃了C中复杂的指针,使其变得简明易学。并且作为开源软件,Python允许对代码进行阅读,拷贝甚至改进。这些性能成就了Python的高效率,有“人生苦短,我用Python”之说,是一种十分精彩又强大的语言。

总而言之,开始学Python一定要注意这4点:

1.代码规范,这本身就是一个非常好的习惯,如果开始不养好好的代码规划,以后会很痛苦。

2.多动手,少看书,很多人学Python就一味的看书,这不是学数学物理,你看例题可能就会了,学习Python主要是学习编程思想。

3.勤练习,学完新的知识点,一定要记得如何去应用,不然学完就会忘,学我们这行主要都是实际操作。

4.学习要有效率,如果自己都觉得效率非常低,那就停不停,找一下原因,去问问过来人这是为什么。

 

需要源代码或者想了解更多内容的点击这里获取

 

此文转载文,著作权归作者所有,如有侵权联系小编删除!

 


推荐阅读
  • 根据最新发布的《互联网人才趋势报告》,尽管大量IT从业者已转向Python开发,但随着人工智能和大数据领域的迅猛发展,仍存在巨大的人才缺口。本文将详细介绍如何使用Python编写一个简单的爬虫程序,并提供完整的代码示例。 ... [详细]
  • 技术分享:从动态网站提取站点密钥的解决方案
    本文探讨了如何从动态网站中提取站点密钥,特别是针对验证码(reCAPTCHA)的处理方法。通过结合Selenium和requests库,提供了详细的代码示例和优化建议。 ... [详细]
  • python的交互模式怎么输出名文汉字[python常见问题]
    在命令行模式下敲命令python,就看到类似如下的一堆文本输出,然后就进入到Python交互模式,它的提示符是>>>,此时我们可以使用print() ... [详细]
  • 本文详细介绍了 Dockerfile 的编写方法及其在网络配置中的应用,涵盖基础指令、镜像构建与发布流程,并深入探讨了 Docker 的默认网络、容器互联及自定义网络的实现。 ... [详细]
  • ImmutableX Poised to Pioneer Web3 Gaming Revolution
    ImmutableX is set to spearhead the evolution of Web3 gaming, with its innovative technologies and strategic partnerships driving significant advancements in the industry. ... [详细]
  • Splay Tree 区间操作优化
    本文详细介绍了使用Splay Tree进行区间操作的实现方法,包括插入、删除、修改、翻转和求和等操作。通过这些操作,可以高效地处理动态序列问题,并且代码实现具有一定的挑战性,有助于编程能力的提升。 ... [详细]
  • 本文介绍如何使用阿里云的fastjson库解析包含时间戳、IP地址和参数等信息的JSON格式文本,并进行数据处理和保存。 ... [详细]
  • 本文介绍如何使用JPA Criteria API创建带有多个可选参数的动态查询方法。当某些参数为空时,这些参数不会影响最终查询结果。 ... [详细]
  • 本题通过将每个矩形视为一个节点,根据其相对位置构建拓扑图,并利用深度优先搜索(DFS)或状态压缩动态规划(DP)求解最小涂色次数。本文详细解析了该问题的建模思路与算法实现。 ... [详细]
  • 本文介绍如何在Linux Mint系统上搭建Rust开发环境,包括安装IntelliJ IDEA、Rust工具链及必要的插件。通过详细步骤,帮助开发者快速上手。 ... [详细]
  • 本文详细介绍了如何在 Windows 环境下使用 node-gyp 工具进行 Node.js 本地扩展的编译和配置,涵盖从环境搭建到代码实现的全过程。 ... [详细]
  • 这是一个基于 React 构建的掘金移动版应用,主要模仿了掘金的 UI 设计,并进行了部分自定义调整。项目专注于移动端体验,同时支持服务端渲染和渐进式网络应用(PWA)功能。 ... [详细]
  • 本文将详细介绍Python中一个非常实用的HTTP客户端库——requests模块,它不仅易于使用,而且功能强大,非常适合用于开发网络应用或进行Web数据抓取。 ... [详细]
  • C#爬虫Fiddler插件开发自动生成代码
    哈喽^_^一般我们在编写网页爬虫的时候经常会使用到Fiddler这个工具来分析http包,而且通常并不是分析一个包就够了的,所以为了把更多的时间放在分析http包上,自动化生成 ... [详细]
  • Requests库的基本使用方法
    本文介绍了Python中Requests库的基础用法,包括如何安装、GET和POST请求的实现、如何处理Cookies和Headers,以及如何解析JSON响应。相比urllib库,Requests库提供了更为简洁高效的接口来处理HTTP请求。 ... [详细]
author-avatar
留香1980
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有