scrapy爬取post的数据

来源:互联网 发布:小世界网络的度分布 编辑:程序博客网 时间:2024/05/22 00:15

1.爬取瑞钱宝的投资方式的数据,爬取内容如下:

  

  

2.查看网址,可以发现:





点击下一页时,地址栏里的链接均无任何变化。可以判断出该网页的数据都是post方式上传的。

说一下get和post的区别:

get显式的传参,而post是隐式的。

get的URL会有限制,而post没有。

get没有post安全。

不过,小某还看到一篇内容。点击打开链接

3.F12查找数据

单纯的只看一页的内容,等待响应,然后再network里查找的话,并没有post的数据。应该是F12打开后,点击下一页,查看变化,可以找到post到的数据。

4.用Fiddler工具抓取

用这个工具进行抓取,只能抓取到post的三个参数,像这样的:

pageNo=1&pageSize=10&loanId=a53a4759bf89454dbc5756ca0e12f482

获取的三个参数分别是:pageNo,pageSize,loanId

没有完整的链接,不会拼接。结合第三步,便可以找到完整的网址。比如这样:


再往下查看,就能找到所传的三个参数,然后参数的拼接只需要在后面加上问号“?”然后再加上参数。

比如:

http://www.rqbao.com/loan/ajaxInvestCommonList?pageNo=1&pageSize=10&loanId=a14134837d57458387c271415e2667e6


首页的链接也可以通过这种方式找到。



5.开始分析源代码进行爬取。

获取网页元素的时候用的xpath,大概的思路是先获取首页的title,然后进入下一页获取四个小标题以及下面的内容。可是,用xpath没有得到想要的结果,获取下来的都是所有的title,所有的小标题,所有的内容。可能是不太会用xpath。。。。/(ㄒoㄒ)/~~

遇到的问题

(1)进入到第二个页面时,由于不同的第二个页面投资记录的页数也是不一样的,for循环的时候就不知道应该写多少(是不是很菜!!!)就像这样:

for url in urls:            rea=re.compile('/loan/show-loan-detial-loanId-')            url=rea.sub('',url)            # print url            for pageIndex in range(1,10):                link="http://www.rqbao.com/loan/ajaxInvestCommonList?pageNo="+str(pageIndex)+"&pageSize=10&loanId="+url                # print link                yield Request(link,callback=self.parseTable)
pageNO的范围不明确。

(2)用xpath直接获取所有内容时,这样写的:

items=selector1.xpath('//tr[@class="investRecording"]/td').extract()
可以获取到投资时间,投资金额和投资方式,唯独少了投资用户,再仔细观察源码,投资用户虽然也在<td>标签里,但是里面又嵌了一个<font>标签,最后又用正则把它替换掉。

(3)存储的时候出现问题

一直在报错说,文件不存在,测试一下是存在的。然后修改了一下路径的写法,

#一开始是这样写的D:\Python test\rqbao\rqb.txtwith open('D:\\Python test\\rqbao\\rqb.txt','a') as f:
然后又会报错,说是编码的问题,就在写入的时候encode一下,就能正常写入了。

6.代码如下:

(最近回家,忘记上传啦)

这是一开始写的:

#coding:utf-8from scrapy.spiders import CrawlSpiderfrom scrapy.http import Requestfrom scrapy.selector import Selectorimport reclass QianBao(CrawlSpider):    name = "ruiQBao"    start_urls=['http://www.rqbao.com/loan/loanQueryList2']    def parse(self, response):        selector=Selector(response)        with open('rqb.txt','a') as f:            title=selector.xpath('//span[@class="header"]/a/text()').extract()            for t in title:                f.write(t.encode('utf-8'))                # .encode('utf-8')        f.close()        urls=selector.xpath('//span[@class="header"]/a/@href').extract()        # print urls        for url in urls:            rea=re.compile('/loan/show-loan-detial-loanId-')            url=rea.sub('',url)            # print url            for pageIndex in range(1,10):                link="http://www.rqbao.com/loan/ajaxInvestCommonList?pageNo="+str(pageIndex)+"&pageSize=10&loanId="+url                # print link                yield Request(link,callback=self.parseTable)        for page_links in range(1,5):            pageLink="http://www.rqbao.com/loan/ajaxLoanCommonList?projectType=100&loanStatus=100&loanPeriod=621&pageNo="+str(page_links)+"&pageSize=6&loanType=0"            yield Request(pageLink, callback=self.parse)    def parseTable(self,response):        selector1=Selector(response)        with open('rqb.txt','a') as f:            #D:\\Python test\\rqbao\\            thList=selector1.xpath('//tr[@class="tables"]/th/text()').extract()            for i in thList:                f.write(i.encode('utf-8'))            items=selector1.xpath('//tr[@class="investRecording"]/td').extract()            for item in items:                rep=re.compile("\\\r\\\n")                item=rep.sub('',item)                rep2=re.compile(" ")                data=rep2.sub('',item)                rep3=re.compile('<fontstyle="(.*?)">')                data=rep3.sub('',data)                rep4=re.compile("</font>")                data=rep4.sub(' ',data)                rep5=re.compile('<td(.*?)>')                data=rep5.sub('',data)                rep6=re.compile('</td>')                data=rep6.sub(' ',data)                f.write(data.encode('utf-8'))        f.close()

然后修改方法,用bs模块,因为xpath用的不太熟悉。最后的代码:

#coding:utf-8from scrapy.spiders import CrawlSpiderfrom scrapy.http import Requestfrom bs4 import BeautifulSoupfrom rqbao.items import RqbaoItemclass QianBao(CrawlSpider):    name = "ruiQBao"    start_urls=['http://www.rqbao.com/loan/loanQueryList2']    #先选取了前10页,将所有网址加入进去    for i in range(2,11):        #http://www.rqbao.com/loan/ajaxLoanCommonList?projectType=100&loanStatus=100&loanPeriod=621&pageNo=2&pageSize=6&loanType=0        start_url='http://www.rqbao.com/loan/ajaxLoanCommonList?pageNo='+str(i)#多余的参数可以去掉        start_urls.append(start_url)    url='http://www.rqbao.com'    def parse(self, response):        html=response.body        soup=BeautifulSoup(html,'html.parser')        #获取每一页的标题链接        spans=soup.find_all('span',class_='header')        for span in spans:            href=span.find('a')['href']            url_second=self.url+href            yield Request(url_second,self.parse_item)    def parse_item(self,response):        urls=response.url        #http://www.rqbao.com/loan/show-loan-detial-loanId-4f25722cb79f4b379cbe61c936c7b5c6        loanId=urls.split('-')[-1]#获取投资记录所在页链接里参数loanId        html=response.body        soup=BeautifulSoup(html,'html.parser')        title=soup.find('div',class_='loan_title').get_text(strip=True)#获取标题        page=soup.find('div',class_='disl paged')#获取当前页面,然后在其中的a标签中寻找下一页链接        pageLink=page.find_all('a')        pageNum=pageLink[-2].get_text()        for i in range(1,int(pageNum)+1):            url='http://www.rqbao.com/loan/ajaxInvestCommonList?pageNo='+str(i)+'&pageSize=10&loanId='+loanId            yield Request(url,self.parse_item_item,meta={'title':title})    def parse_item_item(self,response):        html=response.body        soup=BeautifulSoup(html,'html.parser')        trs=soup.find_all('tr')        title=response.meta['title']        with open('D:\\Python test\\rqbao\\%s.txt' % title,'a') as f:#存入文件,注意双斜杠            for tr in trs:                cont=tr.get_text('|',strip=True)                f.write(cont.encode('utf-8')+'\n')








1 0