设备软件准备---环境安装配置
编写工具---pycharm、sublime text3等
运行环境—Python3.X
虚拟环境---virtualenv (主要是可以区别各个环境不同的需求包版本的问题)
爬虫程序编写---普通爬虫文件
请求方法---requests、urlopen等
解析库---xpath、bs4、pyquery等
URL链接地址:
1.根据自己的实际爬取需求设置分页的时候对有规律的URL进行分析
(1)以python为例,for循环,每循环一次的数值转化为string字符串 拼接到url中,如果不确定是否请求成功则可以进行验证后再提取数 据;例如下图:
for i in range(1, 1000):
url = "https://www.kuaidaili.com/free/inha/" + str(i) + "/"
请求头参数:
1.UA标识(某些网站可能根据UA进行反爬)
2.设置Cookie参数(一般情况下只需要登录一次之后拿到有效的cookie并且填入请求头即可
3.设置网页压缩格式 (请求头参数设置此项为了避免网页爬取后的数据为中文乱码,大部分是由于网页远吗被压缩了,所以我们需要解压缩
还有其他的一些参数就不罗列了,基本使用的就是这些
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.149 Safari/537.36",
"Cookie": "channelid=bdtg_a3_a3a2; sid=1588040045318406; _ga=GA1.2.1750935230.1588040048; _gid=GA1.2.9785359.1588040048; Hm_lvt_7ed65b1cc4b810e9fd37959c9bb51b31=1588040048; Hm_lpvt_7ed65b1cc4b810e9fd37959c9bb51b31=1588040059",
}
数据持久化—存储
存储数据---MySQL,Redis,MongoDB,txt,csv,doc,xlsx
1.数据库的话推荐使用redis数据库进行存储,基于内存,读取效率高,相对于MySQL的效率要高一些。并且没有复杂的建表建库操作,,直接可以在Python交互的时候设置好先关参数就可以建库并且存入数据
2.如果是商品信息的话可以将数据存储到csv和xlsx,也便于后期进行分析操作
IP代理
问题:IP代理这里最后说出来,,,很重要,,现在的网站几乎都会进行一个封ip的操作,就是对请求频率过高的用户暂时封禁IP地址访问网站。
解决方案:
1.在python中去设置代理的使用在代理ip有效的情况下进行请求数据,
2.代理的ip一般有许多免费的,但是避免不了去定期维护检测它的可用性,以便爬虫程序正常进行
下面是具体案例
def dailisss():
try:
requests.get('https://www.baidu.com ', proxies={"http": zongdaili})
except:
print('connect failed')
else:
print('success')
con.rpush(zongdaili, 'ip_port')
这里我是使用了异常捕获;在验证后有效的则进行存储redis,否则不会存储,能够使用的代理则会立刻被爬虫程序进行使用,具体的使用如下:
爬取代理网站部分
def save_data(html):
global zongdaili
global daili, daili_port
datalist = etree.HTML(html)
datas = datalist.xpath('//*[@id="list"]')
# items_list = []
for data in datas:
dailis = data.xpath('./table/tbody/tr/td[1]/text()')
# print(dailis)
daili_ports = data.xpath('./table/tbody/tr/td[2]/text()')
for daili in dailis:
continue
for daili_port in daili_ports:
continue
zongdaili = daili + ":" + daili_port
return zongdaili
实际的爬虫程序使用案例
def start_requests(): # 起始请求
url = "https://www.qidian.com/search?kw=的"
headers = {
"User-Agent": 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.149 Safari/537.36',
"Cookie": "gender=male; _csrfToken=ELmDEqeeVHqs1gkfYhqhJuHFHOwB2yIUkxzEDrdO; newstatisticUUID=1587804570_1531161900; tf=1; _qda_uuid=dc63dbaa-1d85-c654-e645-62d1d4be4e45; e1=%7B%22pid%22%3A%22qd_P_Searchresult%22%2C%22eid%22%3A%22%22%7D; e2=%7B%22pid%22%3A%22qd_P_Searchresult%22%2C%22eid%22%3A%22qd_S05%22%2C%22l1%22%3A3%7D",
"Accept-Encoding": "gzip, deflate, br", # 防止网页进行压缩导致的爬取后网页文字乱码
}
response = requests.get(url=url, headers=headers, proxies={"http": zongdaili}) # 拿到列表页
if response.status_code == 200:
html = response.text
save_datas(html) # 将列表页网页源码传递给save_data函数
天猫爬虫文件---数据抓取
天猫商城会对请求频率过高的用户弹出滑块验证码,对此我们可以借助上述提到的使用IP代理池进行爬取,也可以同时去设置请求的间隔时间,比如停止五秒请求一次,这一次便可请求商品列表页的其中一页
简单代码如下:
import requests
from lxml import etree
from time import sleep
def start_requests():
"""
曾经沧海难为水,,,爬虫spider配天猫
:return:
"""
url = "https://list.tmall.com/search_product.htm?spm=a220m.1000858.0.0.65a43cdbn9Hln5&s=60&q=%C0%B2%C0%B2%C0%B2&sort=s&style=g&from=mallfp..pc_1_searchbutton&active=2&type=pc#J_Filter"
headers = {
"User-Agent":"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/11.1.2 Safari/605.1.15",
"Cookie":"isg=BHZ2m9vaNG5aosCKRF7ACNetxap4l7rRQxbNtuBddtnLIxS9SCW64TYVO39PkLLp; l=eBP5sIUmQkd9eQsaBO5BEurza779uQA0zkPzaNbMiIHca1kl6aOmgNQcxCZJJdtfgt5bYetrue0RedFHWXULStGDbLTqUWqSDGv68Bf..; cq=ccp%3D1; _med=dw:1920&dh:1080&pw:1920&ph:1080&ist:0; pnm_cku822=098%23E1hvnvvUvbpvUvCkvvvvvjiPn2LZlj3WP25OQjthPmPOQjinRFLWtjtEPFdpljiniQhvCvvvpZptvpvhvvCvpvyCvhQvAqAGj70fdigXaZmOD46Od3ODNrBl5F%2FAdcwu%2BE7reTTJwyNZeb8rV8t%2Bm7zvdigM%2B3%2B%2BafmAdXKKNB3rl8gL%2BulQbfmxdBkK5FtfKphv8vvvpHwvvUmivvCH4pvv9fwvvhNjvvvmjvvvBGwvvUjuvvCH4pvv9x4EvpvV39CmpwLhuphvmvvvpLCzimdovphvC9mvphvvvvGCvvpvvPMM; res=scroll%3A1324*5419-client%3A1324*879-offset%3A1324*5419-screen%3A1920*1080; tk_trace=1; _tb_token_=58e58f774635d; cookie2=131f479ba88a52baff9dc2251421fe6e; csg=97afaf69; dnk=t_1478447548675_0; enc=4H74Y0r44SGPk5Wz56qVq1SNCjfXbNZIpUgAGnFvo%2BnuMbh8lla0QOPlfSDDwyumkwvmCu8w8l1oW%2FXR9F%2BX0g%3D%3D; lgc=t_1478447548675_0; lid=t_1478447548675_0; sgcookie=Eg58fDyEYk1ICwiZr1rwa; t=880253ed7dfa4bf082072960264a00fb; tracknick=t_1478447548675_0; uc1=cookie16=UIHiLt3xCS3yM2h4eKHS9lpEOw%3D%3D&cookie15=VFC%2FuZ9ayeYq2g%3D%3D&pas=0&cookie14=UoTUMtUJHXDCsg%3D%3D&cookie21=WqG3DMC9EdFmJgke4t0pDw%3D%3D&existShop=false; uc3=id2=UUpniZ1PwvL0Hg%3D%3D&nk2=F6k3HMWzu19fNT832586Rbk%3D&vt3=F8dBxGXNshiZNPQH4%2Bg%3D&lg2=V32FPkk%2Fw0dUvg%3D%3D; uc4=nk4=0%40FbMocpOBNkY7DhFu8FNFi1vK8W6a7WWqnAZhpQ%3D%3D&id4=0%40U2gtGPf5WP7MCXHzaAWz1AslnFcb; cna=kUI2F9A6ZnUCAW/Bcl/c+rlO",
"Accept-Encoding":"br, gzip, deflate",
}
sleep(5)
response = requests.get(url=url,headers=headers)
if response.status_code == 200:
html = response.text
save_data(html)
def save_data(html):
datalist = etree.HTML(html)
datas = datalist.xpath('//div[@class="product-iWrap"]')
items = {}
for data in datas:
items['标题'] = data.xpath('./p[@class="productTitle"]/a/@title')
items['价格'] = data.xpath('./p[@class="productPrice"]/em/@title')
print(items)
if __name__ == '__main__':
start_requests()
至此天猫爬虫程序分析完毕,整个过程还是相当顺利和简单的,只是我们要大胆地去尝试,不能因为某些人说阿里的反爬很强就退后不进啦,这是不对的;我们要勇于在困难中逆水而行。