第一次写文章,望各位大佬看到有什么不好的地方,多指正,少批评( ̄ェ ̄;)。
下面就是项目的总体思路哦,其实在使用这个完整的项目的时候,也写了一个同一个网站代码,但是需求不同,完成的项目是针对详情页,表单参数请求,加上xpath和beautifulsoup解析HTML定位网页标签数据,最后通过csv添加标题,保存对应的数据的思路,所以相对而言代码比较简单,但是网页限制就是会封账号,你的VPN账号!好像抓取的慢就不会被封,因为之前被封的账号都是在加了5个多线程下被封,后面的这个账号一直稳稳的抓取,没有被封,这是一个坑啊,网速一定要好!!!账号选个稳定,因为我是远程做的,一晚上三个小时都是在请求的路上!哭了!
现在就跟大家分享!之前的是请求获取全网站的,比较贪心,结果熬了通宵,写了一千多行代码,给了自己一个教训,就不说了。感兴趣的可以找我(^_−)☆。
首先呐,要准备账号!很重要~当然啦,看你的数据量需求,账号要同一服务器很重要,不然封号之后,更改请求参数就换到你吐血!。
第二个,当然是要确定你的需求啦!以上图片中就是我要抓取的数据,经过搜索之后大概是15000条数据量左右,so,我要先了解它的请求方式、网页的基本反爬手段以及翻页方式。
呐,这就是它的请求方式,我们可以看到,URL地址是通过代理账号ip+网站http加密域名+网页介绍:完整数据整理+附带参数形成的,再通过get请求,得到网站服务器的数据。
那后面的参数肯定不在我们的考虑范围之内,先拿地址再去拼接就好啦,地址有了!
url = “http://2.14.1.a346.prox.zhixinglib.com/full_record.do?”
然后就是网站的基本反爬,当然是上我们请求参数啦,那些隐藏在网站的限制不是我们首先考虑,首先要考虑的当然是我们的反爬三剑客!来看看请求参数,小爷手指一抖,事情不简单啊
注意看host,referer,这些明眼可见的参数,就是带上了我们的Ip呀,那也就是说换个账号或者服务器这些都得换一遍,那想到这个cookie绝对是不能少了,再一琢磨,这不得把整个请求参数都构造上去请求吗!!!那就是这样。因为!!请求参数太长了,而且也要根据具体网站参数,所以下图供各位参考!
(ps:本来想试一下代理池的,但是发现,网站跟ip没关系,只跟代理账号有关系,所以ip!不需要!!!)
接下来就是他的翻页参数,其实我们会有一种误区,理所应当的以为page就是翻页参数,我也是,直接range一手page!但是我们注意看他的请求参数!此时page是1,doc是1,因为我还没有翻页,然后开始翻页,观察参数测试!
开始分析,我先用迭代测试翻页,发现数据并没有随着翻页而变化,so…开始怀疑doc,所以先做页面翻页调试!
翻了3页!发现确实跟page没啥关系,doc才是能迭代数据的重点,那根据这个值,得到翻页的点,那到此我们已经得到我们的三个基本需求啦,网页数据请求、基本网页反爬手段及翻页。
开始pycharm撸代码叭!
import requests
def RequestXQ(pages)
params = {‘product’: ‘UA’,
‘search_mode’: ‘GeneralSearch’,
‘qid’: ‘96’,
‘SID’: ‘8BFLwaUbZpEC9Bl1Rtk’,
‘page’: page,
‘doc’: doc+10*page}
headers={'这里是headers参数,请参考上图!!)
url = “http://2.14.1.a346.prox.zhixinglib.com/full_record.do?”
htm1 = requests.get(url, headers=headers, params=params, verify=False).text
以上就是我发送请求的参数了,构造了get请求携带的params参数,headers请求参数,和发送get请求,携带上的对应参数,verify是验证!doc 修改为doc+10*page,代表着10页的数据之后,page才会刷新+1,所以是10!
下面就是数据解析啦
解析其实有点难在它的标题和作者的值,标题的话,其实我是想过用正则去匹配的,但是发现正则里面包含的数据,用sub清空不完,所以用了beautifulsoup,那通过beautifulsoup.find()定位class属性,发现就是拿不到数据,仔细斟酌了,思虑再三,想到了一个东西,就是他还有一个超级好用的方法,定位css标签,然后就获取到数据啦,嘿嘿!
拿到标题数据之后,就是搞作者的值了,但是我小看它了,首先我直接用的soup.find()定位p标签里class属性.text,就是这么潇洒自信,数据下来就只能流泪了,你只能看到作者这两个大字一行一行的保存在你的文件,后面的数据并没有进来!OK,事实证明,错的就是错的,那怎么办,只能先放弃咯,人生哲理:先做简单的,然后再回来找它,做难的,没错,就是这样,在哪里跌倒,就让它在哪里先趴一会。
事实证明,不顺之后,顺利的就来了,当然了,事实也证明,人生没有一帆风顺的事情,它来了!
参考文献!!!beautifulsoup只能使用赖皮的方式也就是上面的标题方法,定位到了里面的value lang_id 但是呢,只能取到里面的一个值!但是它有很多条!我发现怎么都取不到,很绝望,我翻了官方文档,里面也没有说怎么获取beautifulsoup定位的标签里面的全部的值,如果有知道的大佬,麻烦指点一下告知一下,谢谢!(ps:其实在后面的作者匹配的时候也是这个问题!但是后面换了解析方法!唯一一行标注黑体,希望看到,嘿嘿!)
呐,就是这样,完美解决,并且,每个参考文献后都有列表和""的分割,非常好用!
这是保存之后的效果,奈斯!感觉人生又充满了希望,淦!
于是作者的数据就有了希望,于是,根据需求改了又改,最终的获取数据代码就是以上加以下,作者1条!
希望有人看到我里面的not@class标签,哈哈哈,一点点小心机,在这里真的卡了很久!但是也学会了很多细节的东西,把之前的知识都贯通起来啦!
上面的params_list是存储每个需求数据的大列表。
通过csv保存每条列表的数据!
最后添加了线程!
速度是快乐,账号被封的速度也很快乐!大概被封了11个账号,快乐就来了,有人报销,嘿嘿!
翻页!
最后的最后,希望各位大佬能多指教呀,我也会不定时更新项目滴。
呐,各位大佬喜欢的点个赞呀!
喜欢python的同学可以来兴趣交流群一起玩呀~+裙994162403