Просмотр созданного контента и извлечение ссылок

Есть много страниц Q/A в Stack Overflow, где вывод, кажется, веб-страницы с javascript не возможно использовать паук для обхода и извлечения. Или, по крайней мере, сказать, что это действие просто ограничено и медленно, если это возможно в некоторых ситуациях. Я хотел знать, возможно ли то, что я пытаюсь сделать, ползая с пауком, и если нет возможных альтернатив для достижения моей цели.

У меня есть код для следующего паука, но я не знаю xpath (если он есть), который позволил бы мне извлечь первую страницу URL-адреса junkyardsnear27517 на этой веб-странице: JunkYardsNear27517

У меня есть следующий код, который работал бы, если бы я знал, что поместить в xpath, где извлекать для » сайтов»

# -*- coding: utf-8 -*-
from __future__ import unicode_literals
import scrapy
from scrapy.shell import inspect_response
from scrapy.utils.response import open_in_browser

lkqlist = 'http://www.lkqcorp.com/en-us/locationResults/tag/All/m/24902/fullcrit/%s?lat=%s&lng=%s' % (zipcode, latitude, longitude)

class JunkYardSites(scrapy.Item):
    Sites = scrapy.Field()

class LkqLocationList(scrapy.Spider):
    name = "lkqlist"
    allowed_domains = ["lkqcorp.com"]
    start_urls = (
        lkqlist,    
    )
    def parse(self, response):
        sites = response.xpath('XPATH WOULD GO HERE').extract()
        for element in range(0, len(sites), 1):
            item = JunkYardSites()
            item["Sites"] = sites.pop(0)           
            yield item

Спасибо, я новичок в Python и Scrapy, поэтому ценю любую помощь или руководство, которое я мог получить.

1 ответ

  1. Я не совсем уверен, какие данные вы хотели бы извлечь; «первая страница junkyard url» — только URL-адреса или окружающий текст.

    '//td[@class="basicviewbold"]/script/text()'
    

    даст вам такие результаты, как

    2016-05-24 22:51:46 [scrapy] DEBUG: Scraped from <200 http://www.lkqcorp.com/en-us/locationResults/tag/All/m/24902/fullcrit/27517?lat=35.8263369&lng=-79.0419053>
    {u'Sites': u'\r\n                                            var URL = localizeStoreUrlToCulture("http://www.lkqpickyourpart.com/locations/LKQ_Pick_Your_Part_-_Durham-142/", local.culture);\r\n                                            var name = "LKQ Pick Your Part - Durham";\r\n                                            var anchor = \'<a href="\' + URL + \'" class="lkqro_locLink lkqro_nameLink" >\' + name + \'</a> - 14.54<span id="dnn_ctr952_ControlLoader_BizSearchResult_rptSearchResults_lblDistanceType_0">mi</span> \';\r\n                                            document.write(anchor);\r\n 
    

    Если вы просто хотите, чтобы URL-адреса использовали XPATH с регулярным выражением вместо извлечения():

    sites = response.xpath("//td[@class='basicviewbold']/script/text()").re(r'(?:localizeStoreUrlToCulture\(\")(.*)(?:\", local.culture)')
    

    что дает такие результаты, как:

    2016-05-25 00:37:54 [scrapy] DEBUG: Scraped from <200 http://www.lkqcorp.com/en-us/locationResults/tag/All/m/24902/fullcrit/27517?lat=35.8263369&lng=-79.0419053>
    {u'Sites': u'http://www.lkqpickyourpart.com/locations/LKQ_Pick_Your_Part_-_Durham-142/'}
    2016-05-25 00:37:54 [scrapy] DEBUG: Scraped from <200 http://www.lkqcorp.com/en-us/locationResults/tag/All/m/24902/fullcrit/27517?lat=35.8263369&lng=-79.0419053>
    {u'Sites': u'http://www.lkqpickyourpart.com/locations/LKQ_Pick_Your_Part_-_Raleigh-168/'}
    

    или

    '//table[tr/td[@class="basicviewbold"]]'
    

    Передам вам всю таблицу, из которой Вы тоже можете разобрать адрес:

    2016-05-24 23:06:24 [scrapy] DEBUG: Scraped from <200 http://www.lkqcorp.com/en-us/locationResults/tag/All/m/24902/fullcrit/27517?lat=35.8263369&lng=-79.0419053>
    {u'Sites': u'<table>\r\n                                 <tr id="dnn_ctr952_ControlLoader_BizSearchResult_rptSearchResults_trBusinessName_0">\r\n\t\t\t\t<td class="basicviewbold">\r\n                                        <img src="/desktopmodules/lkq_ROLocator/geosprawlimages/a.png" id="dnn_ctr952_ControlLoader_BizSearchResult_rptSearchResults_imgLetterMarker_0" border="0" alt="Map Marker A" class="lkqro_letterImage">\r\n \r\n                                        <script>\r\n                                            var URL = localizeStoreUrlToCulture("http://www.lkqpickyourpart.com/locations/LKQ_Pick_Your_Part_-_Durham-142/", local.culture);\r\n                                            var name = "LKQ Pick Your Part - Durham";\r\n                                            var anchor = \'<a href="\' + URL + \'" class="lkqro_locLink lkqro_nameLink" >\' + name + \'</a> - 14.54<span id="dnn_ctr952_ControlLoader_BizSearchResult_rptSearchResults_lblDistanceType_0">mi</span> \';\r\n                                            document.write(anchor);\r\n                                        </script>\r\n                                                                   \r\n                                        <input type="hidden" name="dnn$ctr952$ControlLoader$BizSearchResult$rptSearchResults$ctl00$hdnRptRowLat" id="dnn_ctr952_ControlLoader_BizSearchResult_rptSearchResults_hdnRptRowLat_0" value="35.959784">\r\n                                        <input type="hidden" name="dnn$ctr952$ControlLoader$BizSearchResult$rptSearchResults$ctl00$hdnRptRowLong" id="dnn_ctr952_ControlLoader_BizSearchResult_rptSearchResults_hdnRptRowLong_0" value="-78.841397">\r\n                                        <input type="hidden" class="lkqro_division" value="Self-Service">\r\n                                    </td>\r\n\t\t\t</tr>\r\n\t\t\t\r\n                                <tr id="dnn_ctr952_ControlLoader_BizSearchResult_rptSearchResults_trDistance_0" style="display:none;">\r\n\t\t\t</tr>\r\n\t\t\t\r\n                                \r\n                                \r\n                                \r\n                                \r\n                                \r\n                                <tr id="dnn_ctr952_ControlLoader_BizSearchResult_rptSearchResults_trFullAddress_0">\r\n\t\t\t\t<td class="basicview">\r\n                                        1301 S. Miami Blvd\r\n                                        \r\n                                        <br>\r\n                                     \r\n                                     \r\n                                        Durham\r\n                                        NC\r\n                                        27703                                   \r\n                                   </td>\r\n\t\t\t</tr>\r\n\t\t\t\r\n                                \r\n                                <tr id="dnn_ctr952_ControlLoader_BizSearchResult_rptSearchResults_trPhone_0">\r\n\t\t\t\t<td class="basicview">\r\n                                        <script>\r\n                                            var phoneNumber = "(800) 962-2277";\r\n                                            var internationalPhone = \'+1-\' + phoneNumber.replace(\' \', \'\');\r\n                                            internationalPhone = internationalPhone.replace(\'(\', \'\');\r\n                                            internationalPhone = internationalPhone.replace(\')\', \'-\');\r\n                                       \r\n                                            var clickToCall = \'<a class="lkq_clickToCall" href="tel:\' + internationalPhone + \'">\' + phoneNumber + \'</a>\';\r\n                                            var phoneDesktop = \'<span class="lkq_phoneDesktop">\' + phoneNumber + \'</span>\';\r\n                                            document.write(clickToCall + phoneDesktop);\r\n                                        </script>\r\n                                         \r\n                                    </td>\r\n\t\t\t</tr>\r\n\t\t\t\r\n                                <tr id="dnn_ctr952_ControlLoader_BizSearchResult_rptSearchResults_trWebsite_0">\r\n\t\t\t\t<td class="basicview">\r\n                                        <script>\r\n                                            var URL = localizeStoreUrlToCulture("http://www.lkqpickyourpart.com/locations/LKQ_Pick_Your_Part_-_Durham-142/", local.culture);\r\n                                            var anchor = \'<a href="\' + URL + \'" class="lkqro_locLink lkqro_pageURL" >\' + local.locationPage + \'</a>\';\r\n                                            document.write(anchor);\r\n                                        </script>\r\n                                        \xa0|\xa0\r\n                                        <a id="dnn_ctr952_ControlLoader_BizSearchResult_rptSearchResults_lnkFullMap_0" class="lkqro_locLink" href="http://maps.google.com/maps/dir//1301+S.+Miami+Blvd%2c+Durham%2c+27703/@35.959784,-78.841397,17z/?hl=en" target="_blank"><script>document.write(local.getDirections);</script></a>\r\n                                    </td>\r\n\t\t\t</tr>\r\n\t\t\t\r\n                                \r\n                                \r\n                                \r\n                                \r\n                                \r\n                                \r\n                                \r\n                                \r\n                                \r\n                                \r\n                                \r\n                                \r\n                                \r\n                                \r\n                                \r\n                                \r\n                                \r\n                                <tr>\r\n                                    <td class="lkqro_itemSpacer">\r\n                                       <hr>\r\n                                    </td>\r\n                                </tr>\r\n                            \r\n                               </table>'}
    

    Способ структурирования данных

    '//td[@class="basicview"]'
    

    Даст вам адреса, телефоны и т.д.

    2016-05-24 23:13:16 [scrapy] DEBUG: Scraped from <200 http://www.lkqcorp.com/en-us/locationResults/tag/All/m/24902/fullcrit/27517?lat=35.8263369&lng=-79.0419053>
    {u'Sites': u'<td class="basicview">\r\n                                        <script>\r\n                                            var phoneNumber = "(800) 962-2277";\r\n                                            var internationalPhone = \'+1-\' + phoneNumber.replace(\' \', \'\');\r\n                                            internationalPhone = internationalPhone.replace(\'(\', \'\');\r\n                                            internationalPhone = internationalPhone.replace(\')\', \'-\');\r\n                                       \r\n                                            var clickToCall = \'<a class="lkq_clickToCall" href="tel:\' + internationalPhone + \'">\' + phoneNumber + \'</a>\';\r\n                                            var phoneDesktop = \'<span class="lkq_phoneDesktop">\' + phoneNumber + \'</span>\';\r\n                                            document.write(clickToCall + phoneDesktop);\r\n                                        </script>\r\n                                         \r\n                                    </td>'}