2017-02-03 8 views
0

[ОБНОВЛЕНО] Я новичок в scrapy, поэтому, пожалуйста, со мной обойдется; Я пытаюсь просканировать некоторые данные в качестве моего побочного проекта, но у меня возникла проблема с его сбором. Я пробовал в течение двух дней без большой удачи.Scrapy: получение повторных запросов с одного и того же URL-адреса с разными значениями

Первая проблема: Когда я сканирую почтовую форму на главной странице, я получаю неправильный токен.

Вторая проблема: Я прочитал и я попытался реализовать scrapy docs request, чтобы получить номер телефона, но напрасно, или этот ответ stackoverflow

Третья проблема: Как бы я пойти в выполните следующую страницу (закомментируйте код внутри gumtree.py).

Четвертая проблема: я теперь в состоянии получить телефонные номера, но я получаю неоднократные просьбы к тому же URL с различными значениями, [просмотреть результаты]

Я был бы очень признателен, если кто-нибудь может дать мне направление. Моя основная цель - сканировать сообщение, которое имеет номера телефонов Я попытался выполнить поиск stackoverflow, но я не смог найти подходящую запись. Большое спасибо

setting.py

BOT_NAME = 'crawler' 
SPIDER_MODULES = ['crawler.spiders'] 
NEWSPIDER_MODULE = 'crawler.spiders'enter code here 
USER_AGENT = "Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/27.0.1453.93 Safari/537.36" 
TELNETCONSOLE_ENABLED = False 

gumtree.py [ОБНОВЛЕНО]

# -*- coding: utf-8 -*- 
import re 
import json 
import scrapy 

from scrapy import Request, Item, Field, Selector 

def complete_link(string): 
    return string 

class MyItem(Item): 
    token = Field() 
    post_id = Field() 
    post_url = Field() 
    phone_num = Field() 
    phone_url = Field() 


class GumtreeSpider(scrapy.Spider): 
    name = "gumtree" 
    allowed_domains = ["gumtree.com"] 
    start_urls = [ 
     'https://www.gumtree.com/search?search_category=cars', 
    ] 

    def parse(self, response): 
     item = MyItem() 
     for href in response.css('a.listing-link::attr(href)').extract(): 
      domain = 'https://www.gumtree.com' + href 
      request = Request(domain, callback=self.parse_post, meta={'domain':domain,'item':item}) 
      yield request 

     # next_page = response.css('li.pagination-next a::attr("href")').extract_first() 
     # if next_page is not None: 
     #  next_page = response.urljoin(next_page) 
     #  yield Request(next_page, callback=self.parse) 

    def parse_post(self, response): 
     item = response.meta['item'] 
     item['post_url'] = response.meta['domain'] 
     post_id = re.match('.*?([0-9]+)$', item['post_url']) 
     if post_id: 
      item['post_id'] = post_id.group(1) 
      token = response.xpath('//script[contains(., "revealSellerTelephoneNumberToken")]').extract() 
      arr_token = re.findall(r'"([^"]*)"', str(token)) 
      if len(arr_token) == 15: 
       item['token'] = arr_token[-2] 
       request = Request('https://www.gumtree.com/ajax/account/seller/reveal/number/' + item['post_id'], headers={'X-GUMTREE-TOKEN':item['token']}, callback=self.parse_phone, meta={'item':item}) 
       yield request 

    def parse_phone(self, response): 
     item = response.meta['item'] 
     phone = json.loads(response.body_as_unicode()) 
     item['phone_num'] = phone['data'] 
     return item 

Результаты: [SCRAPY ползать Gumtree -o .. \ result.json]

{"post_url": "https://www.gumtree.com/p/ford/ford-galaxy-2.0-tdci-auto-titanium-7-seater-full-service-history-alloys/1214586540", "post_id": "1214586540", "token": "eyJhbGciOiJIUzI1NiJ9.eyJuYmYiOjE0ODYyMjgwMTUsImlzcyI6Imh0dHBzOlwvXC93d3cuZ3VtdHJlZS5jb20iLCJleHAiOjE0ODYyNDk2MTQsImlhdCI6MTQ4NjIyODAxNCwiYWR2ZXJ0X2lkIjoxMjE0NTg2NTQwfQ.Lv0aCIKHo_2DbTcIw7RvE535PFAD5OX16_SFMDz--Cs", "phone_num": "004407488470949"}, 
{"post_url": "https://www.gumtree.com/p/ford/ford-galaxy-2.0-tdci-auto-titanium-7-seater-full-service-history-alloys/1214586540", "post_id": "1214586540", "token": "eyJhbGciOiJIUzI1NiJ9.eyJuYmYiOjE0ODYyMjgwMTUsImlzcyI6Imh0dHBzOlwvXC93d3cuZ3VtdHJlZS5jb20iLCJleHAiOjE0ODYyNDk2MTQsImlhdCI6MTQ4NjIyODAxNCwiYWR2ZXJ0X2lkIjoxMjE0NTg2NTQwfQ.Lv0aCIKHo_2DbTcIw7RvE535PFAD5OX16_SFMDz--Cs", "phone_num": "004407488470949"}, 
{"post_url": "https://www.gumtree.com/p/ford/ford-galaxy-2.0-tdci-auto-titanium-7-seater-full-service-history-alloys/1214586540", "post_id": "1214586540", "token": "eyJhbGciOiJIUzI1NiJ9.eyJuYmYiOjE0ODYyMjgwMTUsImlzcyI6Imh0dHBzOlwvXC93d3cuZ3VtdHJlZS5jb20iLCJleHAiOjE0ODYyNDk2MTQsImlhdCI6MTQ4NjIyODAxNCwiYWR2ZXJ0X2lkIjoxMjE0NTg2NTQwfQ.Lv0aCIKHo_2DbTcIw7RvE535PFAD5OX16_SFMDz--Cs", "phone_num": "01527853397"}, 

ответ

0

Вы проверили, что meta ['item'] фактически передается parse_token()?

Я хотел бы сделать следующее: meta = { 'item': item } request = Request(response.urljoin(href), meta=meta, callback=self.parse_token) yield request

+0

Здравствуйте, andjelx, спасибо за ваш повтор, но я смог исправить токенную часть, поэтому у нее была «сквозная» (первая проблема). – ombra23

+0

Что у него было? Дайте мне пожалуйста пример – andjelx

+0

В основном мне нужно: «Теперь я могу получить номера телефонов, но я получаю повторяющиеся запросы к одному и тому же URL-адресу с разными значениями». Как вы можете видеть из результатов в основном потоке, я получил три запроса на один и тот же URL-адрес, но с разными номерами телефонов. Я не понимаю, почему. Большое спасибо – ombra23

0

Я нашел решение.

# -*- coding: utf-8 -*- 
import re, json, scrapy 

from crawler.items import CrawlerItem 
from scrapy import Request, Item, Field, Selector 

gumtree = 'https://www.gumtree.com' 
getphone = 'https://www.gumtree.com/ajax/account/seller/reveal/number/' 

class GumtreeSpider(scrapy.Spider): 
    name = "gumtree" 
    allowed_domains = ["gumtree.com"] 
    start_urls = [ 
     'https://www.gumtree.com/search?search_category=cars', 
    ] 
    def parse(self, response): 
     item = CrawlerItem() 
     pid = [] 
     arr_url = [] 
     for href in response.css('a.listing-link::attr(href)').extract(): 
      if len(href) > 0: 
       post_id = u''.join(href).encode('utf-8').strip() 
       post_id = re.match('.*?([0-9]+)$', post_id) 
       if post_id: 
        pid.append(post_id.group(1)) 
        domain = gumtree + href 
        arr_url.append(domain) 

     i = 0 
     while i < len(arr_url): 
      url = u''.join(arr_url[i]).encode('utf-8').strip() 
      request = Request(url, callback=self.parse_post, meta={'url':url,'item':item,'pid':pid[i]}, headers={'Referer':gumtree}) 
      i += 1 
      yield request 

     next_page = response.css('li.pagination-next a::attr("href")').extract_first() 
     if next_page is not None: 
      next_page = response.urljoin(next_page) 
      yield Request(next_page, callback=self.parse) 

    def parse_post(self, response): 
     item = response.meta['item'] 
     item['post_id'] = response.meta['pid'] 
     item['post_url'] = response.meta['url'] 
     token = response.xpath('//script[contains(., "revealSellerTelephoneNumberToken")]').extract() 
     arr_token = re.findall(r'"([^"]*)"', str(token)) 
     if len(arr_token) == 15: 
      item['token'] = arr_token[-2] 
      ref = item['post_url'] 
      req = Request(getphone + item['post_id'], callback=self.parse_phone, headers={'X-GUMTREE-TOKEN':item['token'], 'Referer':ref}, meta={'url':response.meta['url'],'item':item}) 
      return req 

    def parse_phone(self, response): 
     item = response.meta['item'] 
     item['post_url'] = response.meta['url'] 
     phone = json.loads(response.body_as_unicode()) 
     item['phone_num'] = u''.join(phone['data']).encode('utf-8').strip() 
     return item