Очистка от бесконечных результатов («Просмотреть больше») с доставкой в ​​JSON - PullRequest
1 голос
/ 09 февраля 2020

Я собираюсь очистить этот URL .

Каждый элемент в списке ссылается на дополнительную информацию о нем. Я стремлюсь очистить все 17000 связанных страниц. Отображается только 10 результатов, и кнопка view more делает запрос, который добавляет, через JSON, еще 10 результатов в список. Я попытался изменить запрос, изменив batchsize , параметр, используемый для определения количества результатов в списке, но это не сработало. Я также пытался использовать этот код (из учебника ), но не смог адаптировать его к моей конкретной задаче c:

import json
import scrapy


class SpidyQuotesSpider(scrapy.Spider):
    name = 'spidyquotes'
    quotes_base_url = 'http://spidyquotes.herokuapp.com/api/quotes?page=%s'
    start_urls = [quotes_base_url % 1]
    download_delay = 1.5

    def parse(self, response):
        data = json.loads(response.body)
        for item in data.get('quotes', []):
            yield {
                'text': item.get('text'),
                'author': item.get('author', {}).get('name'),
                'tags': item.get('tags'),
            }
        if data['has_next']:
            next_page = data['page'] + 1
            yield scrapy.Request(self.quotes_base_url % next_page)

Я посмотрел примеры здесь , здесь и здесь . Однако после 2 дней попыток я все еще не могу понять, как решить эту проблему, потому что запрос URL на сайте, который я хочу очистить, отличается от всех примеров, и кажется, что они затруднили его очистку. ..

Запрос, сделанный нажатием больше , выглядит следующим образом:

URL запроса: https://www.1177.se/api/hjv/search?batchsize=10&caretype=&componentname&cs=false&location=&p=2&q=&s=name&sortorder=name&st=4af2ed43-1154-4363-ae6b-718f9b84d23a

Параметр p = увеличивается при нажатии Показать больше : enter image description here

Возвращенное значение JSON имеет следующий формат:

{"Заголовок": " 17952 träffar på Alla mottagningar ", "Query": "", "Region": null, «NextPage»: 3, «Страница»: 2, «BatchSize»: 10, «BatchText»: «Visa 10 till», «TotalHits»: 17952, «SortOrder»: «name», «Latitude»: 0.0, «Longitude ": 0.0," Граница ": NULL," SearchHits ": [{" HsaId ":" SE162321000255-O23228" , "FriendlyUrl": "/ Hitta-Vard / kontaktkort / А5-Psykoterapi-Katia-Карлсон-Carli-AB- Lund / "," DisplayName ":" A5 Психотерапия Катя Карлссон Карли AB, Lund "," Аддр ss ":" Stortorget 1, Lund "," PhoneNumber ":" 073-046 26 68 "," HasMvkServices ": true," VaccinatesForFlu ": false," VaccinatesForHpv ": false," Distance ": 0.0," Latitude ": 55.703161529482479, «Долгота»: 13.193039057187006}, {«HsaId»: «SE162321000255-O22542», «FriendlyUrl»: «/ hitta-vard / kontaktkort / A5Psykoterapi-Gunilla-Lundqvrap-Lund / P: -»: Lundqvist, Lund "," Address ":" Stortorget 1 5: e vån, Lund "," PhoneNumber ":" 070-624 13 97 "," HasMvkServices ": true," VaccinatesForFlu ": false," VaccinatesForHpv ": false, "Расстояние": 0.0, "широта": 55,703161529482479, "долгота": 13,193039057187006}, { "HsaId": "SE2321000057-6SV4", "FriendlyUrl": "/ Hitta-Vard / kontaktkort / A6-Ogonklinik-АВ /", "DisplayName": "A6 Ögonklinik AB", "Address": "Batterigatan 9 NB, Jönköping", "PhoneNumber": "036-860 20 30", "HasMvkServices": true, "VaccinatesForFlu": false, "VaccinatesForHpv": ложным, "Расстояние": 0.0, "широта": 57,768032303027383, "долгота": +14,202798620555548}, { "HsaId": "SE162321000024-0059892", "FriendlyUrl": "/ Hitta-Vard / kontak tkort / AB-Evelina-Linder-KBT / "," DisplayName ":" AB Evelina Linder KBT "," Address ":" Drottninggatan 1A, Uppsala "," PhoneNumber ":" 073-593 00 73 "," HasMvkServices ": ложным, "VaccinatesForFlu" ложь "VaccinatesForHpv" ложь "Расстояние": 0.0, "широта": +59,858328320441558, "долгота": +17,638292776307694}, { "HsaId": "SE162321000024-0052597", "FriendlyUrl": "/ hitta-vard / kontaktkort / AB-Forsberg-KBT-konsult / "," DisplayName ":" AB Forsberg KBT-konsult "," Address ":" Trädgårdsgatan 5A, Uppsala "," PhoneNumber ":" 070-818 17 11 " , "HasMvkServices": ложные, "VaccinatesForFlu" ложь "VaccinatesForHpv" ложь "Расстояние": 0.0, "широта": 59,856845411620185, "долгота": 17,635819529969204}, { "HsaId": "SE2321000016-C7H4",» FriendlyUrl ":" / hitta-vard / kontaktkort / AB-Lyhord-Ostermalmstorg / "," DisplayName ":" AB Lyhörd - Östermalmstorg "," Адрес ":" Östermalmstorg 1, STOCKHOLM "," PhoneNumber ":" 08-425 004 00" , "HasMvkServices": ложные, "VaccinatesForFlu" ложь "VaccinatesForHpv": ложь, "Расстояние": 0,0, "широта": +59,336237708592563, "Долгота": +18,0793170997 84653}, {"HsaId": "SE2321000016-BH0B", "FriendlyUrl": "/ hitta-vard / kontaktkort / AB-Suavis-horsel-Solna-Business-park /", "DisplayName": "AB Suavis hörsel, Solna Бизнес-парк "," Адрес ":" Svetsarvägen 15,2 tr, SOLNA "," PhoneNumber ":" 010-207 11 77" , "HasMvkServices": ложные, "VaccinatesForFlu" ложь "VaccinatesForHpv" ложь "Расстояние": 0.0, "широта": +59,35928477168008, "долгота": 17,980058512140353}, { "HsaId": "SE2321000016-56DM" , "FriendlyUrl": "/ hitta-vard / kontaktkort / AB-Vackra-Tander-Annette-Goransson /", "DisplayName": "AB Vackra Tänder Annette Göransson", "Адрес": "Drottninggatan 71A, STOCKHOLM", "PhoneNumber ":" 08-21 52 62 "," HasMvkServices ": false," VaccinatesForFlu ": false," VaccinatesForHpv ": false," Distance ": 0.0," Latitude ": 59.33592153903674," Longitude ": 18.059258535271329}, {" HsaId ":" SE5564844115-106Q "," FriendlyUrl ":" / hitta-vard / kontaktkort / AB-Vackra-Tander-Norrmalm / "," DisplayName ":" AB Vackra Tänder, Norrmalm "," Address ":" Drottninggatan 71 A , 3 tr, "," PhoneNumber ":" 08-21 52 62 "," HasMvkServices ": false," VaccinatesForFlu ": false," VaccinatesForHpv ": false," Distance ": 0.0," Latitude ": 59.33592396728109," Longitude ": 18.059118082991937}, {" HsaId ":" SE2321000016-97P2 "," FriendlyUrl ":" / hitta-vard / kontaktkort / ABA-Ogonklinik-i-Alvik / "," DisplayName ":" ABA Ög onklinik i Alvik "," Address ":" Tranebergsplan 3,, BROMMA "," PhoneNumber ":" 08-124 440 10 "," HasMvkServices ": true," VaccinatesForFlu ": false," VaccinatesForHpv ": false," Distance " : 0.0, "Latitude": 59.33516807973394, "Longitude": 17.978288641135208}], "HasZeroHits": false}

Я был бы благодарен за некоторые начальные строки кода, которые могли бы помочь мне.

Ответы [ 2 ]

0 голосов
/ 11 февраля 2020

Это должно сработать:

Headerz = {
    'accept': 'text/html, */*; q=0.01',
    'accept-encoding': 'gzip, deflate, br',
    'accept-language': 'en-US,en;q=0.9',
    'cache-control': 'no-cache',
    'content-type': 'application/x-www-form-urlencoded; charset=UTF-8',
    'pragma': 'no-cache',
    'sec-fetch-mode': 'cors',
    'sec-fetch-site': 'same-origin',
    'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.130 Safari/537.36',
}

class SpidyQuotesSpider(scrapy.Spider):
    name = 'spidyquotes'
    start_urls = ['https://www.1177.se/api/hjv/search?batchsize=10&caretype=&componentname&cs=false&location=&p={}&q=&s=name&sortorder=name&st=4af2ed43-1154-4363-ae6b-718f9b84d23a']

    def start_requests(self):
        # You may also need to replicate the headers used in the requests made to this URL.
        yield scrapy.Request(self.start_urls[0].format('1'), headers=Headerz)

    def parse(self, response):
        data = json.loads(response.body)
        # you have json data in data variable, do what you intent to do so
        try:
            # paginate
            if not data['NextPage'] is None:
                nextpage_number = data['NextPage']
                nexturl = self.start_urls[0].format( str(nextpage_number) )
                yield scrapy.Request(nexturl, headers=Headerz)
        except:
            pass

Суть в том, чтобы использовать правильные заголовки!

0 голосов
/ 11 февраля 2020

Этот код может работать, а может и не работать, но такой подход я бы выбрал, учитывая проблему, с которой вы столкнулись. Вы можете вставить {} в начальный URL, чтобы использовать формат. Кроме того, когда вы oop просматриваете данные ['quotes'], вы теперь имеете дело с JSON объектом, а не селектором Scrapy. Поэтому нет необходимости вызывать .get ().

import json
import scrapy


class SpidyQuotesSpider(scrapy.Spider):
    name = 'spidyquotes'
    start_urls = ['https://www.1177.se/api/hjv/search?batchsize=10&caretype=&componentname&cs=false&location=&p={}&q=&s=name&sortorder=name&st=4af2ed43-1154-4363-ae6b-718f9b84d23a']

    def start_requests(self):
        # You may also need to replicate the headers used in the requests made to this URL.
        yield scrapy.Request(self.start_urls[0].format('1'))

    def parse(self, response):
        data = json.loads(response.body)
        for item in data['quotes']:
            # remember you're no longer dealing with a scrapy selector but now a json object
            yield {
                'text': item['text'],
                'author': item['name'],
                'tags': item['tags'],
            }
        if data['has_next']:
            # convert to integer to do addition
            next_page = int(data['page']) + 1
            yield scrapy.Request(self.start_urls[0].format(next_page), callback=self.parse)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...