Ошибка при создании параметров для request.get - PullRequest
1 голос
/ 28 мая 2020

Я повторяю этот сайт и пытаюсь очистить ссылки новостных статей. https://www.usnews.com/search?q=China%20COVID-19#gsc .tab = 0 & gs c .q = China% 20COVID-19 & gs c .page = 1

Во-первых, мне нужно получить ссылки на страницы, поэтому Я использовал этот код:

def scrap(url):
    user_agent = {'user-agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64; Trident/7.0; Touch; rv:11.0) like Gecko'}
    request = 0
    params = {
        'q': 'China%20COVID-19',
        'gsc.tab': '0',
        'gsc.q': 'China%20COVID-19',
    }
    pagelinks = []

    myarticle = []
    for page_no in range(1,3):
        try:# to avoid "No connection adapters were found for" error
            params['gsc.page'] = page_no
            response = requests.get(url=url,
                                    headers=user_agent,
                                    params=params) 
            print(response.request.url)

        except Exception as e:
            print(e)
scrap('https://www.usnews.com/search/')

Однако результаты неверны:

https://www.usnews.com/search?q=China%252520COVID-19&gsc.tab=0&gsc.q=China%252520COVID-19&gsc.page=1
https://www.usnews.com/search?q=China%252520COVID-19&gsc.tab=0&gsc.q=China%252520COVID-19&gsc.page=2

Ожидаемые результаты должны быть такими:

https://www.usnews.com/search?q=China%20COVID-19#gsc.tab=0&gsc.q=China%20COVID-19&gsc.page=1
https://www.usnews.com/search?q=China%20COVID-19#gsc.tab=0&gsc.q=China%20COVID-19&gsc.page=2

Может ли кто-нибудь помочь мне решить эту ошибку? Я был бы очень признателен!

Ответы [ 2 ]

1 голос
/ 28 мая 2020

Поиск в браузере приводит к «хешированным» URL-адресам (https://www.usnews.com/search#...), вам необходимо создать URL-адрес самостоятельно.
Передача параметров запросам через requests.get(..., params=params) создает обычную строку запроса (https://www.usnews.com/search?...), которая ведет на неправильные страницы (всегда первые).

import requests
from urllib.parse import urlencode, unquote

def scrap(url):
    user_agent = {'user-agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64; Trident/7.0; Touch; rv:11.0) like Gecko'}
    request = 0
    url = 'https://www.usnews.com/search'
    params = {
        'q': 'China COVID-19',
        'gsc.tab': '0',
        'gsc.q': 'China COVID-19'
    }
    pagelinks = []
    myarticle = []

    for page_no in range(1,4):
        params['gsc.page'] = page_no
        _url = '%s#%s' % (url, urlencode(params))

        try:# to avoid "No connection adapters were found for" error
            response = requests.get(url=_url,
                                    headers=user_agent)
            print(_url, '>>', _url == unquote(response.request.url))

        except Exception as e:
            print(e)

scrap('https://www.usnews.com/search/')

Вывод:

https://www.usnews.com/search#q=China+COVID-19&gsc.tab=0&gsc.q=China+COVID-19&gsc.page=1 >> True
https://www.usnews.com/search#q=China+COVID-19&gsc.tab=0&gsc.q=China+COVID-19&gsc.page=2 >> True
https://www.usnews.com/search#q=China+COVID-19&gsc.tab=0&gsc.q=China+COVID-19&gsc.page=3 >> True
1 голос
/ 28 мая 2020

Если вы откроете в браузере полученные URL-адреса, вы увидите, что строка поиска - China%2520COVID-19, а не China COVID-19, как вы ожидали.

%20, что вы видите в строке запроса пробел urlencoded. См. процентное кодирование в MDN . Если вы urldecode China%2520COVID-19, вы получите China%20COVID-19, и я получу, что %25 - это закодированный символ процента.

Вероятно requests уже urlencodes значения строки вашего запроса , так что вам не нужно. Чтобы он работал, вы можете использовать декодированные значения, например пробелы () вместо %20.

    params = {
        'q': 'China COVID-19',
        'gsc.tab': '0',
        'gsc.q': 'China COVID-19',
    }
...