您的位置:首页 > 其它

scrapy爬取post的数据

2016-04-27 21:25 274 查看
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,[b]loanId[/b]

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



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

比如:

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')
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: