Python 仅收集第一页内容的刮板
我已经使用python编写了一个刮刀,从yiffy torrents中刮取电影名称。该网页已浏览了约12页。如果我使用Python 仅收集第一页内容的刮板,python,python-3.x,web-scraping,return,Python,Python 3.x,Web Scraping,Return,我已经使用python编写了一个刮刀,从yiffy torrents中刮取电影名称。该网页已浏览了约12页。如果我使用print语句运行爬虫程序,它会给出所有页面的所有结果。但是,当我使用return运行相同的程序时,它只会给出第一页的内容,而不会继续到下一页来处理其余的内容。由于我很难理解返回语句的行为,如果有人指出我哪里出了问题,并给我一个解决办法,我会非常高兴。提前谢谢 这就是我正在尝试的(完整代码): 但是,当我喜欢下面的内容时,我会得到所有结果(仅粘贴要点部分): 您的film\u存储
print
语句运行爬虫程序,它会给出所有页面的所有结果。但是,当我使用return
运行相同的程序时,它只会给出第一页的内容,而不会继续到下一页来处理其余的内容。由于我很难理解返回语句的行为,如果有人指出我哪里出了问题,并给我一个解决办法,我会非常高兴。提前谢谢
这就是我正在尝试的(完整代码):
但是,当我喜欢下面的内容时,我会得到所有结果(仅粘贴要点部分):
您的
film\u存储
结果列表是函数get\u links()
的本地结果列表,该函数在下一页递归调用。递归调用之后(对于接下来的所有页面),initial(entry)函数只返回第一页的结果
您必须(1)将尾部递归展开为循环,(2)使结果列表全局化;(3) 使用回调(如调用print
),或者最好的选择(4)是将get\u links
函数转换为生成器,生成所有页面的结果
生成器版本:
def get_links(link):
root = fromstring(requests.get(link).text)
for item in root.cssselect(".mv"):
name = item.cssselect("h3 a")[0].text
yield name
next_page = root.cssselect(".pager a:contains('Next')")[0].attrib['href'] if root.cssselect(".pager a:contains('Next')") else ""
if next_page:
full_link = urljoin(link,next_page)
for name in get_links(full_link):
yield name
return语句过早地终止了get_links()函数。意思是这一部分
next_page = root.cssselect(".pager a:contains('Next')")[0].attrib['href'] if root.cssselect(".pager a:contains('Next')") else ""
if next_page:
full_link = urljoin(link,next_page)
get_links(full_link)
永远不会被执行
快速修复方法是将return语句放在函数的末尾,但必须使film_存储全局化(在get_links()函数之外定义)
编辑:
刚刚意识到,由于您将使您的胶片存储全球化,因此不需要返回声明
主要代码如下所示:
get_links(main_link)
for item in film_storage:
print(item)
这似乎是有希望的。尝试一下,让你知道。谢谢。顺便说一句,这只是一个快速解决方案,因为你提到你刚刚开始你的刮擦之旅。但我建议您以后尝试@randomir的解决方案/建议。这样,您可以制作更好、更高效的刮刀。抱歉,刚刚意识到,由于film_存储是全局的,因此不需要返回语句。您的解决方案工作得非常完美。基本上,我在这里粘贴的是完整代码的一小部分,应该由类重用。再次感谢。你为主要声明建议的部分也起作用了。顺便说一句,我在主要陈述下写这部分的方式有什么问题?请注意回复。谢谢,谢谢你的意见+1。不客气,但请注意,您应该尽量避免使用全局变量。它们使您的代码可读性降低,程序的不同部分以意外的方式耦合,并且总体上您的程序更容易出错。
next_page = root.cssselect(".pager a:contains('Next')")[0].attrib['href'] if root.cssselect(".pager a:contains('Next')") else ""
if next_page:
full_link = urljoin(link,next_page)
get_links(full_link)
get_links(main_link)
for item in film_storage:
print(item)