【发布时间】:2017-12-26 16:51:44
【问题描述】:
在用python写了一些代码之后,我陷入了深深的困境。我是在 python 中遵循 OOP 设计编写代码的新手。我在代码中使用的 xpath 完美无缺。通过“page_crawler”类的实例在“info_grabber”类中运行“passing_links”方法时,我迷失了方向。每次我运行我的代码时,我都会收到一个错误“'page_crawler' 对象没有属性 'passing_links'”。也许我写我的类爬虫的方式不是它应该的样子。但是,由于我已经花了几个小时在它上面,所以我想我可能会得到任何关于我应该纠正哪些行以使其工作的建议。提前感谢您查看它:
from lxml import html
import requests
class page_crawler(object):
main_link = "https://www.yellowpages.com/search?search_terms=pizza&geo_location_terms=San%20Francisco%2C%20CA"
base_link = "https://www.yellowpages.com"
def __init__(self):
self.links = [self.main_link]
def crawler(self):
for link in self.links:
self.get_link(link)
def get_link(self, link):
print("Running page "+ link)
page = requests.get(link)
tree = html.fromstring(page.text)
item_links = tree.xpath('//h2[@class="n"]/a[@class="business-name"][not(@itemprop="name")]/@href')
for item_link in item_links:
return self.base_link + item_link
links = tree.xpath('//div[@class="pagination"]//li/a/@href')
for url in links:
if not self.base_link + url in self.links:
self.links += [self.base_link + url]
class Info_grabber(page_crawler):
def __init__(self, plinks):
page_crawler.__init__(self)
self.plinks = [plinks]
def passing_links(self):
for nlink in self.plinks:
print(nlink)
self.crawling_deep(nlink)
def crawling_deep(self, uurl):
page = requests.get(uurl)
tree = html.fromstring(page.text)
name = tree.findtext('.//div[@class="sales-info"]/h1')
phone = tree.findtext('.//p[@class="phone"]')
try:
email = tree.xpath('//div[@class="business-card-footer"]/a[@class="email-business"]/@href')[0]
except IndexError:
email=""
print(name, phone, email)
if __name__ == '__main__':
crawl = Info_grabber(page_crawler)
crawl.crawler()
crawl.passing_links()
现在执行时,当它到达“self.crawling_deep(nlink)”行时,我收到一个新错误“raise MissingSchema(error)”
【问题讨论】:
-
如果您还没有 - 看看scrapy - 它可以让您免于重新发明轮子。
-
感谢 Jon Clements 先生的评论。我也和scrapy一起工作过。我想知道类的基本模式和不同的方面。再次感谢。
-
我认为您的意思是使用字符串 ( url ) 启动
Info_grabber实例,而您在plinks中传递了一个page_crawler对象,这会在您尝试时使您的程序崩溃在crawling_deep方法中使用requests来“获取”它。轻松修复:crawl = Info_grabber('http://some.url')。它不会使您的程序崩溃,但我怀疑它会给您带来预期的结果。我知道您正在尝试通过这个项目提高您的 OOP 技能,但我认为您过于复杂了。 -
感谢 t.m.adam 先生的热心回答。我给 Info_grabber 类提供了一个 url,它确实为单个链接获取了预期的结果。但是,在我的 page_crawler 类中,我注意到它能够生成 400 个链接,我想将这些链接传递给 Info_grabber 类,但找不到任何想法。这是这 400 个新生成的链接中的一个链接,以查看结果。 crawl = Info_grabber('yellowpages.com/san-francisco-ca/mip/…) 需要注释掉 parse.crawler()。
标签: python python-3.x oop web-scraping