Как исправить 'Парсинг электронной почты от модального' в запросе Post - PullRequest
0 голосов
/ 12 июня 2019

Я использую Windows 10 с Python 3 и Scrapy. Вот ссылка на сайт, который мне нужен для разбора адреса электронной почты

https://find.plasticsurgery.org/city/new-york

чтобы получать по электронной почте от отдельных людей, нужно щелкать каждый раз, но я получил POST-запрос из сетевого раздела и разработал паука-скрапа, но все равно он не разбирает письма.

url = "https://find.plasticsurgery.org/default.aspx/GetMemberInfo"

and the payload = {"memberId":"102971","searchId":"38066000"}

ниже моего кода паука

from scrapy.http import Request, FormRequest
from scrapy.utils.response import open_in_browser
from time import sleep
import scrapy
import csv
import json
import urllib

# urllib.parse.urlencode()

class PlasticsurgerySpider(scrapy.Spider):
    name = 'plasticsurgery'
    url = "https://find.plasticsurgery.org/default.aspx/GetMemberInfo"
    start_urls = [url]

    def parse(self, response):
        payload = {"memberId":"102971","searchId":"38066000"}
        yield Request(response.url, self.parse_page, method="POST", body=urllib.parse.urlencode(payload))
        # yield FormRequest.from_response(
        #             response=response,
        #             formdata=payload,
        #             callback=self.parse_page,
        #         )


    def parse_page(self, response):
        # data = json.loads(response.body)
        # print(data)
        # open_in_browser(response)
        email = response.xpath('//*[@class="btn btn-default card-btn email"]//@href').extract_first()
        email = email.replace('mailto:','')

        yield {
        'email':email
        }

конец результатов, которые я нашел, просто {'email': '#'}

мы ожидаем результата для адреса электронной почты, такого как {'email': any@anyemail.com enj

Ответы [ 2 ]

0 голосов
/ 12 июня 2019

Это то, что вы можете сделать, чтобы получить имена и их адреса электронной почты. Не стесняйтесь использовать разные идентификаторы поиска, чтобы получить разные результаты, например 38078106 или 38066000 e.t.c.

import json
import scrapy

class PlasticsurgerySpider(scrapy.Spider):
    name = 'plasticsurgery'
    post_url = "https://find.plasticsurgery.org/default.aspx/GetMemberInfo"
    headers = {"content-type": "application/json; charset=UTF-8"}
    start_urls = ["https://find.plasticsurgery.org/city/new-york"]

    def parse(self, response):
        items = set([item.split("('")[1].split("')")[0] for item in response.css("a[onclick^='showMemberInfo']::attr(onclick)").getall()])
        for item in items:
            payload = {'memberId':item,'searchId':'38066000'}
            yield scrapy.Request(url=self.post_url,headers=self.headers,callback=self.parse_page, method="POST", body=json.dumps(payload))

    def parse_page(self,response):
        data = json.loads(response.body_as_unicode())
        for item in data:
            name = data[item]['MemberName'].strip()
            email = data[item]['Email']
            yield {"name":name,"email":email}
0 голосов
/ 12 июня 2019

Может быть, вам нужно использовать настоящие заголовки?

headers = {
    'origin': 'https://find.plasticsurgery.org',
    'accept-encoding': 'gzip, deflate, br',
    'accept-language': 'en-US,en;q=0.9',
    'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.80 Safari/537.36',
    'content-type': 'application/json; charset=UTF-8',
    'accept': 'application/json, text/javascript, */*; q=0.01',
    'referer': 'https://find.plasticsurgery.org/city/new-york',
    'authority': 'find.plasticsurgery.org',
    'x-requested-with': 'XMLHttpRequest',
    'dnt': '1',
}

body= '{"searchId":"38074964","memberId":"20747"}'

yield Request('https://find.plasticsurgery.org/default.aspx/GetMemberInfo', headers=headers, body=body)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...