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.txt with open('D:\\Python test\\rqbao\\rqb.txt','a') as f:然后又会报错,说是编码的问题,就在写入的时候encode一下,就能正常写入了。
6.代码如下:
(最近回家,忘记上传啦)
这是一开始写的:
#coding:utf-8 from scrapy.spiders import CrawlSpider from scrapy.http import Request from scrapy.selector import Selector import re class 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-8 from scrapy.spiders import CrawlSpider from scrapy.http import Request from bs4 import BeautifulSoup from rqbao.items import RqbaoItem class 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')
神龙|纯净稳定代理IP免费测试>>>>>>>>天启|企业级代理IP免费测试>>>>>>>>IPIPGO|全球住宅代理IP免费测试