jhao104 / jhao104/proxy_pool

如何在scrapy框架调用ip池?

Open
#300 5 comments 0 reactions 0 assignees View on GitHub
Dominant language
Python
Stars
23.7k
Forks
5.4k
PR merge metrics
No merged PRs in 30d

Description

我用了楼主的ip池,可以成功跑起来,但是不知道如何在python scrapy框架进行调用。
我尝试了很多种办法,但是感觉每种方法都不行,现在的办法报的错误是:
`2019-06-26 18:36:26 [scrapy.core.scraper] ERROR: Spider error processing (referer: None)
Traceback (most recent call last):
File "/Library/Python/2.7/site-packages/scrapy/utils/defer.py", line 102, in iter_errback
yield next(it)
File "/Library/Python/2.7/site-packages/scrapy/spidermiddlewares/offsite.py", line 29, in process_spider_output
for x in result:
File "/Library/Python/2.7/site-packages/scrapy/spidermiddlewares/referer.py", line 339, in
return (_set_referer(r) for r in result or ())
File "/Library/Python/2.7/site-packages/scrapy/spidermiddlewares/urllength.py", line 37, in
return (r for r in result or () if _filter(r))
File "/Library/Python/2.7/site-packages/scrapy/spidermiddlewares/depth.py", line 58, in
return (r for r in result or () if _filter(r))
File "/Users/leeo/Desktop/Synyi/12.药品目录爬虫/丁香园药品助手/DXY_spider/DXY_spider/spiders/DXY.py", line 58, in parse
yield response.follow(href, self.parse_drug_instruction)
File "/Library/Python/2.7/site-packages/scrapy/http/response/text.py", line 157, in follow
errback=errback
File "/Library/Python/2.7/site-packages/scrapy/http/response/__init__.py", line 124, in follow
raise ValueError("url can't be None")
ValueError: url can't be None`

跪求各位大佬指点迷津!!!

我的爬虫代码如下:
`# -*- coding: utf-8 -*-
import scrapy
import requests

def get_proxy():
return requests.get("http://127.0.0.1:5010/get/").content

def delete_proxy(proxy):
requests.get("http://127.0.0.1:5010/delete/?proxy={}".format(proxy))
def getHtml(href):
# ....
retry_count = 5
proxy = get_proxy()
while retry_count > 0:
try:
html = requests.get(href, proxies={"http": "http://{}".format(proxy)})
#request = request(url=href)
#request.meta['proxy'] = proxy
#yield request
# 使用代理访问
return html
except Exception:
retry_count -= 1
# 出错5次, 删除代理池中代理
delete_proxy(proxy)
return None


#your spider code
#yield Request(meta={'proxy': "http://%s"%(random.choice(["IP:PORT", "IP:PORT"]))})
class DXYSpider(scrapy.Spider):

name = 'DXY'
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.143 Safari/537.36',
}

#proxy = get_proxy()
#start_urls = getHtml("https://drugs.dxy.cn/category/1227.htm")
#allowed_domains = ['drugs.dxy.cn']
start_urls = ['https://drugs.dxy.cn/category/1227.htm']
#cookie_dict = {}

#requests.get(start_urls, proxies={"http": "http://{}".format(get_proxy)})

def parse(self, response):
# follow links to drug instruction page
for href in response.css('div.fl h3 a::attr(href)').extract():
#href = "http:"+href
href = getHtml(href)
#print(href)
#request(url=href)
#request.meta['proxy'] = get_proxy()
#yield response.follow(href, self.parse_drug_instruction)
#yield request

# follow pagination links
for href in response.css('div.pagination span a::attr(href)').extract():
href = "https://drugs.dxy.cn/category/1227.htm" +href
href = getHtml(href)
#print (href)
#yield href
#yield response.follow(href, self.parse)

def parse_drug_instruction(self, response):
def extract_with_css(query):
return response.css(query).get(default='').strip()

yield {
'response_url': response.url,
'drug_title': extract_with_css('.commend::text'),
'drug_name': extract_with_css('dt span.fl::text'), #药品名称
'drug_name_value': response.css('dl dd::text')[0].get().strip(),
'drug_name_value_1': response.css('dl dd::text')[1].get().strip(),
'drug_name_value_2': response.css('dl dd::text')[2].get().strip(),

'ingredient': extract_with_css('dt span.fl#2::text'), #成分
'ingredient_value': response.css('dl dd::text')[4].get().strip(),

'idication': extract_with_css('dt span.fl#3::text'), #适应症
'idication_value': response.css('dl dd::text')[5].get().strip(),

'usage_dosage': extract_with_css('dt span.fl#4::text'), #用法用量
'usage_dosage_value': response.css('dl dd::text')[6].get().strip(),

'ADRs': extract_with_css('dt span.fl#14::text'), #不良反应
'ADRs_value': response.css('dl dd::text')[7].get().strip(),

'contraindication': extract_with_css('dt span.fl#12::text'), #禁忌症
'contraindication_value': response.css('dl dd::text')[9].get().strip(),

'precaution': extract_with_css('dt span.fl#13::text'), #注意事项
'precaution_value': response.css('dl dd::text')[10].get().strip(),

'interaction': extract_with_css('dt span.fl#6::text'), #药物相互作用
'interaction_value': response.css('dl dd::text')[12].get().strip(),

'approve': extract_with_css('dt span.fl#39::text'), #批准文号
'approve_value': response.css('dl dd::text')[15].get().strip(),

'OTC': extract_with_css('dt span.fl#47::text'), #是否OTC
'OTC_value': response.css('dl dd::text')[16].get().strip(),

'company': extract_with_css('dt span.fl#1::text'), #生产企业
'company_value': response.css('dl dd::text')[17].get().strip(),

'classification': extract_with_css('dt span.fl#7::text'), #药物分类
'classification_value': response.css('dl dd::text')[18].get().strip(),
}
`

Contributor guide

No contributing guide indexed for this repository

Assessment

This issue has not been assessed yet.

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.