Webscraping от клика, вот шаги:


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

Это простой скрипт, который ведет от царапин сайту yellowbook.

Я хочу использовать списочные включения, но им удобно использовать циклы for, но я вижу, как она может быть однообразной.

Каких способов я могу сделать это чище ?

service_name = input("Input Industry: ")
city = input("Input The City: ")

class Item(scrapy.Item):
    business_name = scrapy.Field()
    phone_number = scrapy.Field()
    website = scrapy.Field()


class QuotesSpider(scrapy.Spider):
    name = "quotes"

    start_urls = [
        "http://www.yellowbook.com/s/" + service_name + "/" + city 
    ]
    def __init__(self):
        self.seen_business_names = []
        self.seen_websites = []


    def parse(self, response):
        for business in response.css('div.listing-info'):
            item = Item()
            item['business_name'] = business.css('div.info.l h2 a::text').extract()
            item['website'] = business.css('a.s_website::attr(href)').extract()
            for x in item['business_name'] and item['website']:
                #new code here, call to self.seen_business_names
                if (x not in self.seen_business_names and x not in self.seen_websites):
                    if item['business_name']:
                        if item['website']:
                            item['phone_number'] = business.css('div.phone-number::text').extract_first()
                            yield item
                            self.seen_business_names.append(x)




        # next_page = response.css('div.pagination a::attr(href)').extract()
        for href in response.css('ul.page-nav.r li a::attr(href)'):
            yield response.follow(href, self.parse)


145
4
задан 9 марта 2018 в 01:03 Источник Поделиться
Комментарии
1 ответ

Во-первых: общее замечание - просто вложенные if утверждения эквивалентны одному if с заявлениями присоединились and.

Так:

if a:
if b:
if c:

Эквивалентно:

if a and b and c:

Во-вторых: у вас есть if тест, чтобы увидеть, если business_name и website существовать - но вы делаете много других вещей, прежде чем этот тест. Вы можете переместить выше, так что вы 'побег', что более быстрый код, если вы делаете что-то вроде:

item['business_name'] = business.css('div.info.l h2 a::text').extract()
item['website'] = business.css('a.s_website::attr(href)').extract()
if item['business_name'] and item['website']:
for x in item['business_name'] and item['website']:
#new code here, call to self.seen_business_names
if (x not in self.seen_business_names and x not in self.seen_websites):
item['phone_number'] = business.css('div.phone-number::text').extract_first()
self.seen_business_names.append(x)
yield item

(Я поставил append перед yield это выглядит немного яснее для меня).

Третье - я не думаю, что вы имеете в виду for x in item['business_name'] and item['website']:

А можно сделать либо из:

for x in item['business_name'] + item['website']:

Или:

from itertools import chain
for x in chain(item['business_name'], item['website']):

4
ответ дан 9 марта 2018 в 03:03 Источник Поделиться