今天在做爬取的時候.碰上了一個大坑.整了一天了,百思不得其解.還請大佬指點一番,謝謝!
在scrapy框架中,起先我使用scrapy.FormRequest()方法發送的一個post請求,卻接收不到資料.代碼如下:
class FjggfwSpider(scrapy.Spider):
name = 'fjggfw'
allowed_domains = ['fjggfw.gov.cn']
start_urls = ['https://www.fjggfw.gov.cn/Website/AjaxHandler/BuilderHandler.ashx']
def start_requests(self):
url = self.start_urls[0]
num = random.random()
data_dict = {
'OPtype': 'GetListNew',
'pageNo': '1',
'pageSize': '10',
'proArea': '-1',
'category': 'GCJS',
'announcementType': '5',
'ProType': '-1',
'xmlx': '-1',
'projectName': '',
'TopTime': '2019-06-09 00:00:00',
'EndTime': '2019-09-07 23:59:59',
'rrr': '%s' % num, }
yield scrapy.FormRequest(url, formdata=https://bbs.csdn.net/topics/data_dict, callback=self.parse)
def parse(self, response):
print('+++++',response.text)
print('=====',len(response.text))
settings.py中的請求頭部分代碼如下:
DEFAULT_REQUEST_HEADERS = {
'USER_AGENT':'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.100 Safari/537.36',
'Cookie': '一個很長的cookie'
'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8',
'Accept': 'application/json, text/javascript, */*; q=0.01',
}
運行的結果是,獲取不到任何資料.我就換了一種方法,使用scrapy.Request的post方法,卻還是接收不到任何資料,代碼如下:
class FjggfwSpider(scrapy.Spider):
name = 'fjggfw'
allowed_domains = ['fjggfw.gov.cn']
start_urls = ['https://www.fjggfw.gov.cn/Website/AjaxHandler/BuilderHandler.ashx']
def start_requests(self):
url = self.start_urls[0]
num = random.random()
data_str = json.dumps({
'OPtype': 'GetListNew',
'pageNo': 1,
'pageSize': 10,
'proArea': -1,
'category': 'GCJS',
'announcementType': 5,
'ProType': -1,
'xmlx': -1,
'projectName':'',
'TopTime': '2019-06-09 00:00:00',
'EndTime': '2019-09-07 23:59:59',
'rrr': '%s' % num,
})
yield scrapy.Request(url, body=data_str, method='POST', callback=self.parse)
結果換了這種寫法也不行,仍然是獲取不到任何資料,我很納悶,我就用新建了一個test.py檔案,用requests庫的post方法試了一下,沒相當卻可以正常接收資料,代碼如下:
url = 'https://www.fjggfw.gov.cn/Website/AjaxHandler/BuilderHandler.ashx'
headers = {
'Cookie': '_qddac=4-3-1.1nk5dz.9v9kbn.k09bvah6; ASP.NET_SessionId=kpf3jdrnokalcn1xy4a2kxu1; __root_domain_v=.fjggfw.gov.cn; _qddaz=QD.w0v57s.s4gyx6.k092itpm; Hm_lvt_94bfa5b89a33cebfead2f88d38657023=1567831712,1567831736; Hm_lvt_63d8823bd78e78665043c516ae5b1514=1567831712,1567831737; _qdda=4-1.1nk5dz; _qddab=4-9v9kbn.k09bvah6; Hm_lpvt_63d8823bd78e78665043c516ae5b1514=1567847414; _qddamta_2852155767=4-0; Hm_lpvt_94bfa5b89a33cebfead2f88d38657023=1567848173; _qddagsx_02095bad0b=94572d3487f831178003076a3b5c57890569894bd829132e5d69b3004e04ecef7f03c1fca8a7951959f60d7142c265065e3794afadb5555b6d2d7abd126ac51ade1332fcda11a2a47d9d731df66d243644724a35e4f1fc20efde9cae6c66faa447bb15a10b7a665de098b86d4371d2e44f101d26cf33fa61878080558f4966b5'
}
num = random.random()
data = {
'OPtype': 'GetListNew',
'pageNo': 1,
'pageSize': 10,
'proArea': -1,
'category': 'GCJS',
'announcementType': 5,
'ProType': -1,
'xmlx': -1,
'projectName': '',
'TopTime': '2019-06-09 00:00:00',
'EndTime': '2019-09-07 23:59:59',
'rrr': '%s' % num,
}
response = requests.post(url, data=https://bbs.csdn.net/topics/data, headers=headers)
print(response.content.decode())
沒想到這樣卻可以正常接收資料,那我就更納悶了,前面兩種scrapy中發送post請求的方法scrapy.Request()和scrapy.FormRequest()里,我寫的代碼哪里錯了嗎?為什么請求不到資料呢?看了很久原始碼也不清楚,通過搜索引擎也找不到答案.只能寄希望于各位大佬了,如果有懂這方面知識的大哥還請指教一下,謝謝謝謝
uj5u.com熱心網友回復:
....醉了你把這個給注釋了。
# allowed_domains = ['fjggfw.gov.cn']
uj5u.com熱心網友回復:
謝謝幫助!
我剛剛試著注釋掉那行允許的域,然后再去運行
結果還是接收不到內容
兩種scrapy方法都是……
uj5u.com熱心網友回復:
哪位大哥能幫幫我呢?uj5u.com熱心網友回復:
有內容阿,你看看日志debg
uj5u.com熱心網友回復:
....醉了
你把這個給注釋了。
# allowed_domains = ['fjggfw.gov.cn']
謝謝幫助!
我剛剛試著注釋掉那行允許的域,然后再去運行
結果還是接收不到內容兩種scrapy方法都是……
有內容阿,你看看日志debg
第一種,加上headers = {cookie=‘’}
uj5u.com熱心網友回復:
....醉了
你把這個給注釋了。
# allowed_domains = ['fjggfw.gov.cn']
謝謝幫助!
我剛剛試著注釋掉那行允許的域,然后再去運行
結果還是接收不到內容兩種scrapy方法都是……
有內容阿,你看看日志debg
內容是空的,日志里回應是200,但列印出來是空的,什么都沒有。
uj5u.com熱心網友回復:
....醉了
你把這個給注釋了。
# allowed_domains = ['fjggfw.gov.cn']
謝謝幫助!
我剛剛試著注釋掉那行允許的域,然后再去運行
結果還是接收不到內容兩種scrapy方法都是……
有內容阿,你看看日志debg
第一種,加上headers = {cookie=‘’}
我在settings中是設了cookie了,當然我也按你說的這樣設可以下,結果還是,列印出來的回應是空白的
uj5u.com熱心網友回復:
scrapy發送post請求
1. 如果沒有手動在請求頭中添加content-type資訊,scrapy會自動將Content-Type: application/x-www-form-urlencoded添加到請求頭中
或者你手動設定在請求頭中添加Content-Type: application/x-www-form-urlencoded,
以上情況,發送post請求,應該使用scrapy.FormRequest 例
yield scrapy.FormRequest(
url,
formdata=https://bbs.csdn.net/topics/{"xxx" : "xxx"}
...
)
2. 如果你在請求頭中添加 Content-Type: application/json;charset=utf-8
發送post請求,應該使用scrapy.Request post 例
yield scrapy.Request(
url,
method="POST",
body=json.dumps({"xxx": "xxx"})
...
)
uj5u.com熱心網友回復:
scrapy異步太容易被反爬了。大概率被捕捉到了,回傳了空資料。修改settings并發數量并進行一定的delay有效。uj5u.com熱心網友回復:
給你點啟發 我也遇到過直接post可以 和用scrapy框架post 不可以的情況, 我的heard頭里有cookies=‘ mldn-session-id=e0ff0d79-67ed-4de4-8214-cef2a64f4338; Hm_lvt_3a8d2f2413002da52f064192b0390e6c=1574409038’這種帶=號的,直接requests.post可以 到了scrapy.FormRequest 設定headers=self.heard 怎么都不可以 然后我把cookies單獨拿出來寫成字典的形式,_cookies ={'mldn-session-id':'e0ff0d79-67ed-4de4-8214-cef2a64f4338','Hm_lvt_3a8d2f2413002da52f064192b0390e6c':'1574409038’},然后再scrapy.FormRequest里單獨賦值cookies.........scrapy.FormRequest(url=post_url,headers=self.heard, cookies=_cookies,formdata=https://bbs.csdn.net/topics/self.formdata,callback=self.parse) 然后發現成功了
也搞了我個把小時
uj5u.com熱心網友回復:
把你heards里的cookies 單獨拿出來 寫成字典形式的重新賦值 就可以了轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/124983.html
