2016-09-27 4 views
0

Im, перемещающийся из запросов python в scrapy, я хотел бы сделать запрос на отправку, который нажимает кнопку внизу страницы hashtag instagram.Данные о Scrapy Post

локонов это

curl "https://www.instagram.com/query/" -H "cookie: mid=VwBJIwAEAAGiVNY3epWm9pRgD9Ge; fbm_124024574287414=base_domain=.instagram.com; ig_pr=1; ig_vw=956; s_network=; fbsr_124024574287414=5HQEzU7XMqOLO4KeQMmSvyBcKsH2svemV1-nWIE4_iM.eyJhbGdvcml0aG0iOiJITUFDLVNIQTI1NiIsImNvZGUiOiJBUUQ0TnNLMjVCZmdvUFN4TjdfODNQaW81Z3U4MTNaZmZWVlNCcEdJNUdRWlczdmdfNGVXNXJyck5Sc3NXRFlSWjZiZEpWMU95V3hNUUcwSE9qMHItYlRiYk40VXpNZG5aLUJ5Zzk0VWZNSW1RZTd4R1JzTS1yaXRabmc0Z3FYNkpwbnF4b0VXajRPNEVGSDVoTXBCUFNHUGNHN0RHQ01uSjFLeXh1dllOc2cyaFpnSDFheVI0RUhMbE1nZGM4emVrNm9DXzdLa2s1TUoyYzhyYmEwWXo1VkI1bVVmS3NvLS11dXVxdjJlRmxFUHpYczVNQ3E1bW5BRk5IeWxxMG9veENQcXcwWUVLSnpsNnZSUzFReGUzQWpsQzFPU0cySU1QM0wwMGhUcnRraFF4ZEFhZElVMUtNNUw5VTRab2dlbjltdUFadkJjV0U3UUMxeTdibDRyTzhwWCIsImlzc3VlZF9hdCI6MTQ3NDkzODQ3MywidXNlcl9pZCI6IjEzNzc3ODgzNjkifQ; csrftoken=th33gPnvrsNS74reomY69ETfojX2avQ7" -H "origin: https://www.instagram.com" -H "accept-encoding: gzip, deflate, br" -H "accept-language: en-US,en;q=0.8" -H "user-agent: Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.116 Safari/537.36" -H "x-requested-with: XMLHttpRequest" -H "x-csrftoken: th33gPnvrsNS74reomY69ETfojX2avQ7" -H "x-instagram-ajax: 1" -H "content-type: application/x-www-form-urlencoded" -H "accept: */*" -H "referer: https://www.instagram.com/explore/tags/love/" -H "authority: www.instagram.com" --data "q=ig_hashtag(love)+"%"7B+media.after(J0HV-nGYwAAAF0HV-nGXAAAAFjgA"%"2C+10)+"%"7B"%"0A++count"%"2C"%"0A++nodes+"%"7B"%"0A++++caption"%"2C"%"0A++++code"%"2C"%"0A++++comments+"%"7B"%"0A++++++count"%"0A++++"%"7D"%"2C"%"0A++++comments_disabled"%"2C"%"0A++++date"%"2C"%"0A++++dimensions+"%"7B"%"0A++++++height"%"2C"%"0A++++++width"%"0A++++"%"7D"%"2C"%"0A++++display_src"%"2C"%"0A++++id"%"2C"%"0A++++is_video"%"2C"%"0A++++likes+"%"7B"%"0A++++++count"%"0A++++"%"7D"%"2C"%"0A++++owner+"%"7B"%"0A++++++id"%"0A++++"%"7D"%"2C"%"0A++++thumbnail_src"%"2C"%"0A++++video_views"%"0A++"%"7D"%"2C"%"0A++page_info"%"0A"%"7D"%"0A+"%"7D&ref=tags"%"3A"%"3Ashow" --compressed 

Таким образом, для данных формы я попытался две вещи:

body = response.xpath("//body") 
html = str(body.extract()) 
end_cursor = re.search(r"\"end\_cursor\"\: \"(.+?)\"", html).group(1) 

data = "q=ig_hashtag({})+%7B+media.after({}+10)+%7B%0A++count%2C%0A++nodes+%7B%0A++++caption%2C%0A++++code%2C%0A++++comments+%7B%0A++++++count%0A++++%7D%2C%0A++++comments_disabled%2C%0A++++date%2C%0A++++dimensions+%7B%0A++++++height%2C%0A++++++width%0A++++%7D%2C%0A++++display_src%2C%0A++++id%2C%0A++++is_video%2C%0A++++likes+%7B%0A++++++count%0A++++%7D%2C%0A++++owner+%7B%0A++++++id%0A++++%7D%2C%0A++++thumbnail_src%2C%0A++++video_views%0A++%7D%2C%0A++page_info%0A%7D%0A+%7D&ref=tags%3A%3Ashow".format(tag, end_cursor) 
url = 'https://www.instagram.com/query/' 

yield Request(url, body=data, method="POST", callback=self.parseHashtag) 

и это

data = {"q" :"ig_hashtag({})+%7B+media.after({}+10)+%7B%0A++count%2C%0A++nodes+%7B%0A++++caption%2C%0A++++code%2C%0A++++comments+%7B%0A++++++count%0A++++%7D%2C%0A++++comments_disabled%2C%0A++++date%2C%0A++++dimensions+%7B%0A++++++height%2C%0A++++++width%0A++++%7D%2C%0A++++display_src%2C%0A++++id%2C%0A++++is_video%2C%0A++++likes+%7B%0A++++++count%0A++++%7D%2C%0A++++owner+%7B%0A++++++id%0A++++%7D%2C%0A++++thumbnail_src%2C%0A++++video_views%0A++%7D%2C%0A++page_info%0A%7D%0A+%7D&ref=tags%3A%3Ashow".format(tag, end_cursor)} 
yield FormRequest(url, formdata=data, callback=self.parseHashtag) 

Я получаю ошибку 403, так что я я, очевидно, отправляю данные некорректно, неправильно ли я форматирование данных или неправильное обращение к сообщению? Это мои две мысли, но я совершенно не уверен. Любая помощь будет очень признательна, спасибо.

URL, это - https://www.instagram.com/explore/tags/love/

Это мой мерзавец, https://github.com/Fuledbyramen/instagram_crawler/blob/master/instagram/spiders/instagram_spider.py

ответ

1

Вы, кажется, отсутствуют правильные заголовки или любые заголовки для этого вопроса.

Вы должны предоставить каждый заголовок, который вы видите в сетевом инспекторе, за исключением файлов cookie, которые управляются и заполняются программой.

Вы можете легко извлечь заголовки из локонов струнной сети инспектировать дает вам по:

foo = '''-H "accept-encoding: gzip, deflate, br" -H "accept-language: en-US,en;q=0.8" -H "user-agent: Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.116 Safari/537.36" -H "x-requested-with: XMLHttpRequest" -H "x-csrftoken: th33gPnvrsNS74reomY69ETfojX2avQ7" -H "x-instagram-ajax: 1" -H "content-type: application/x-www-form-urlencoded" -H "accept: */*" -H "referer: https://www.instagram.com/explore/tags/love/" -H "authority: www.instagram.com"''' 
headers = [s.strip(' "').split(': ') for s in foo.split('-H')] 
headers = [h for h in headers if any(h)] 
headers = {k: v for k,v in headers} 

И вы получите:

{'accept': '*/*', 
'accept-encoding': 'gzip, deflate, br', 
'accept-language': 'en-US,en;q=0.8', 
'authority': 'www.instagram.com', 
'content-type': 'application/x-www-form-urlencoded', 
'referer': 'https://www.instagram.com/explore/tags/love/', 
'user-agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.116 Safari/537.36', 
'x-csrftoken': 'th33gPnvrsNS74reomY69ETfojX2avQ7', 
'x-instagram-ajax': '1', 
'x-requested-with': 'XMLHttpRequest'} 

Некоторые из них совершенно не нужно, как реферер в основном используется для анализа, принятия-языка, принятия и принятия-кодирования, скорее всего, будет проигнорировано. Пользователь-агент также управляется с помощью scrapy.

Итак, у вас есть x-crsftoken, который ничего не может сделать, но обычно они скрыты где-то в источнике html; x-instagram-ajax выглядит как статический заголовок, указывающий запрос ajax; x-requested-with показывает тип запроса и в основном там, чтобы предотвратить нападение человека в середине атаки, вы должны иметь его, чтобы указать, что тип запроса не блокируется.

Редактировать: Я пробовал веб-сайт, и вы можете actualyl просто выполнить запрос GET с телом в качестве параметров URL. Просто щелкните правой кнопкой мыши в окне проверки сети и нажмите copy location with parameters, это автоматически преобразует данные, подобные диктону, из тела в параметрах url.

т.е. https://www.instagram.com/query/?q=ig_hashtag(scrapy)%20%7B%20media.after(J0HV-vvswAAAF0HV-Qp7AAAAFiYA%2C%2016)%20%7B%0A%20%20count%2C%0A%20%20nodes%20%7B%0A%20%20%20%20caption%2C%0A%20%20%20%20code%2C%0A%20%20%20%20comments%20%7B%0A%20%20%20%20%20%20count%0A%20%20%20%20%7D%2C%0A%20%20%20%20comments_disabled%2C%0A%20%20%20%20date%2C%0A%20%20%20%20dimensions%20%7B%0A%20%20%20%20%20%20height%2C%0A%20%20%20%20%20%20width%0A%20%20%20%20%7D%2C%0A%20%20%20%20display_src%2C%0A%20%20%20%20id%2C%0A%20%20%20%20is_video%2C%0A%20%20%20%20likes%20%7B%0A%20%20%20%20%20%20count%0A%20%20%20%20%7D%2C%0A%20%20%20%20owner%20%7B%0A%20%20%20%20%20%20id%0A%20%20%20%20%7D%2C%0A%20%20%20%20thumbnail_src%2C%0A%20%20%20%20video_views%0A%20%20%7D%2C%0A%20%20page_info%0A%7D%0A%20%7D&ref=tags%3A%3Ashow

+0

О, я на самом деле добавил заголовки, но просто хотел бы знать, как отправить данные, это то, как я добавил некоторые из них:. CSRF = re.search (г "csrftoken \ = (+ ?) \; ", str (response.headers)). group (1) response.headers ['x-csrftoken'] = csrf – Fuledbyramen

+0

FormRequest в значительной степени просто Request with method = 'POST', который преобразует значение в formdata для запроса тело. Поэтому достаточно иметь Request (method = 'POST') с правильными заголовками и телом. Вы также можете оптимизировать поиск заголовков, просто используя response.headers.get ('csrftoken'), поскольку scrapy Response уже форматирует все для вас. – Granitosaurus

+0

Итак, правильно ли я форматировал первый запрос?Я бы, вероятно, придерживался Request, а не FormRequest, потому что cURL не дает dict, просто строка – Fuledbyramen

Смежные вопросы