خطأ مؤشر العنكبوت Scrapy
-
05-07-2019 - |
سؤال
وهذا هو رمز للSpyder1 التي كنت تحاول الكتابة ضمن إطار Scrapy:
from scrapy.contrib.spiders import CrawlSpider, Rule
from scrapy.contrib.linkextractors.sgml import SgmlLinkExtractor
from scrapy.selector import HtmlXPathSelector
from scrapy.item import Item
from firm.items import FirmItem
class Spider1(CrawlSpider):
domain_name = 'wc2'
start_urls = ['http://www.whitecase.com/Attorneys/List.aspx?LastName=A']
rules = (
Rule(SgmlLinkExtractor(allow=["hxs.select(
'//td[@class='altRow'][1]/a/@href').re('/.a\w+')"]),
callback='parse'),
)
def parse(self, response):
hxs = HtmlXPathSelector(response)
JD = FirmItem()
JD['school'] = hxs.select(
'//td[@class="mainColumnTDa"]').re('(?<=(JD,\s))(.*?)(\d+)'
)
return JD
SPIDER = Spider1()
والتعبير المعتاد في rules
تسحب بنجاح جميع عناوين المواقع الحيوية التي أريد من رابط البداية:
>>> hxs.select(
... '//td[@class="altRow"][1]/a/@href').re('/.a\w+')
[u'/cabel', u'/jacevedo', u'/jacuna', u'/aadler', u'/zahmedani', u'/tairisto', u
'/zalbert', u'/salberts', u'/aaleksandrova', u'/malhadeff', u'/nalivojvodic', u'
/kallchurch', u'/jalleyne', u'/lalonzo', u'/malthoff', u'/valvarez', u'/camon',
u'/randerson', u'/eandreeva', u'/pangeli', u'/jangland', u'/mantczak', u'/darany
i', u'/carhold', u'/marora', u'/garrington', u'/jartzinger', u'/sasayama', u'/ma
sschenfeldt', u'/dattanasio', u'/watterbury', u'/jaudrlicka', u'/caverch', u'/fa
yanruoh', u'/razar']
>>>
ولكن عند تشغيل رمز أحصل
[wc2] ERROR: Error processing FirmItem(school=[]) -
[Failure instance: Traceback: <type 'exceptions.IndexError'>: list index out of range
وهذا هو FirmItem في Items.py
from scrapy.item import Item, Field
class FirmItem(Item):
school = Field()
pass
هل يمكنك مساعدتي فهم حيث يحدث الخطأ مؤشر؟
ويبدو لي أن لديها ما تفعله مع SgmLinkExtractor أ >.
ولقد تم في محاولة لجعل هذا العمل العنكبوت لأسابيع مع Scrapy. لديهم تعليمي ممتاز ولكن أنا جديدة على الثعبان وبرمجة الويب لذلك أنا لا أفهم كيف يمكن على سبيل المثال SgmlLinkExtractor
يعمل خلف الكواليس.
وسيكون من الأسهل بالنسبة لي لمحاولة لكتابة العنكبوت مع نفس الوظائف بسيطة مع مكتبات بايثون؟ وسأكون ممتنا بأي تعليقات والمساعدة.
والشكر
المحلول
وSgmlLinkExtractor لا يدعم محددات في تقريرها حجة "السماح".
وهكذا وهذا خطأ:
SgmlLinkExtractor(allow=["hxs.select('//td[@class='altRow'] ...')"])
وهذا هو الصحيح:
SgmlLinkExtractor(allow=[r"product\.php"])
نصائح أخرى
ويتم استدعاء الدالة تحليل لكل مباراة من SgmlLinkExtractor الخاص بك.
وكما ذكر بابلو تريد تبسيط SgmlLinkExtractor الخاص بك.
وكما أنني حاولت أن تضع كشط الأسماء من رابط الأولي في القائمة ثم تمرير كل اسم تحليل في شكل رابط المطلق كما http://www.whitecase.com/aabbas
(ل/ aabbas).
والتعليمة البرمجية التالية حلقات عبر قائمة، ولكن أنا لا أعرف كيف لتمرير هذا تحليل. هل تعتقد أن هذا هو فكرة أفضل؟
baseurl = 'http://www.whitecase.com'
names = ['aabbas', '/cabel', '/jacevedo', '/jacuna', '/igbadegesin']
def makeurl(baseurl, names):
for x in names:
url = baseurl + x
baseurl = 'http://www.whitecase.com'
x = ''
return url