要编写爬虫程序,首先必须找一个爬虫框架,如果你使用Python语言,可以选用scrapy,如果你使用Java语言,可选用WebMagic,本文使用后者,编写爬虫程序无非分以下几步:
根据URL下载网页,得到HTML(注意并不是通过开发工具看到的HTML,而是网页源代码HTML,这两者有本质区别);
根据HTML解析您所需要的数据,可以利用xpath获取DOM节点内容或属性值;
有可能还需要根据得到的HTML解析出其他链接,利用多线程继续爬取;
解析后的数据存储(数据库,文件等);
WebMagic爬虫框架在core代码中主要有四个模块:Downloader、PageProcessor、Scheduler、Pipeline,分别处理下载,页面解析,管理(管理待抓取的URL,做一些去重工作,默认使用内存队列管理URL,也可以使用Redis进行分布式管理)和持久化工作,因为最终解析出的结构化数据应该是要入库或入文件存储的。
通过代理上网解决IP被封问题
有时候抓取的站点会封我们的IP,公司的外网IP又是固定的,我们可以通过ADSL拨号的方式接入另一个网络,在ADSL网络的服务器上搭建代理服务器,爬虫程序所在的服务器通过代理该台服务器上网,这样再也不怕对方站点封您的IP了,让爬虫程序通过代理爬取网页,代码如下:
import requests
import random
# 要访问的目标页面
targetUrl = "http://httpbin.org/ip"
# 要访问的目标HTTPS页面
# targetUrl = "https://httpbin.org/ip"
# 代理服务器(产品官网 www.16yun.cn)
proxyHost = "t.16yun.cn"
proxyPort = "31111"
# 代理隧道验证信息
proxyUser = "username"
proxyPass = "password"
proxyMeta = "http://%(user)s:%(pass)s@%(host)s:%(port)s" % {
"host" : proxyHost,
"port" : proxyPort,
"user" : proxyUser,
"pass" : proxyPass,
}
# 设置 http和https访问都是用HTTP代理
proxies = {
"http" : proxyMeta,
"https" : proxyMeta,
}
# 设置IP切换头
tunnel = random.randint(1,10000)
headers = {"Proxy-Tunnel": str(tunnel)}
resp = requests.get(targetUrl, proxies=proxies, headers=headers)
print resp.status_code
print resp.text
反爬 / 封 IP
对于封 IP 的情况,可以分为几种情况来处理:
• 首先寻找手机站点、App 站点,如果存在此类站点,反爬会相对较弱。
• 使用代理,如抓取免费代理、购买亿牛云付费代理、使用 Tor 代理、Socks 代理等。
• 在代理的基础上维护自己的代理池,防止代理浪费,保证实时可用。
反爬 / 验证码
验证码分为非常多种,如普通图形验证码、算术题验证码、滑动验证码、点触验证码、手机验证码、扫二维码等。
• 对于普通图形验证码,如果非常规整且没有变形或干扰,可以使用 OCR 识别,也可以使用机器学习、深度学习来进行模型训练,当然打码平台是最方便的方式。
• 对于算术题验证码,推荐直接使用打码平台。
• 对于滑动验证码,可以使用破解算法,也可以模拟滑动。后者的关键在于缺口的找寻,可以使用图片比对,也可以写基本的图形识别算法,也可以对接打码平台,也可以使用深度学习训练识别接口。
• 对于点触验证码,推荐使用打码平台。
• 对于手机验证码,可以使用验证码分发平台,也可以购买专门的收码设备,也可以人工验证。
• 对于扫二维码,可以人工扫码,也可以对接打码平台。
反爬 / 封账号
某些网站需要登录才能爬取,但是一个账号登录之后请求过于频繁会被封号,为了避免封号,可以采取如下措施:
• 寻找手机站点或 App 站点,此种类别通常是接口形式,校验较弱。
• 寻找无登录接口,尽可能寻找⽆无需登录即可爬取的接口。
• 维护 Cookies 池,使⽤用批量账号模拟登录,使⽤时随机挑选可用 Cookies 使⽤即可实现
爬虫中会遇到各种问题,做好爬虫相关优化,使用高质量亿牛云代理才能更加高效稳定采集相关数据。
有疑问加站长微信联系(非本文作者)