2017-02-23 49 views
0

编程仍然很新颖,更具体地说是Python。我一直在为Kickstarter页面开发webscraper。我已经从一个页面上的每个项目中获得所有信息,但我一直在做的方式相对混乱。我想让这个抓取工具抓住第一个项目,抓取数据,追加,然后转到下一个项目,但是它设置为抓取页面中的所有目标数据,并希望它们全部与正确的项目在最后。组织我的BeautifulSoup4网页抓取

(链接的人好奇:https://www.kickstarter.com/discover/advanced?category_id=16&woe_id=0&sort=newest&seed=2479798&page=1

现在,我已经从每一个不仅仅是Blurb的,并链接到每个抢夺更多的数据,但下面是我一直在做一些示例代码。 BeautifulSoup有点令人困惑,因为我相信它会将事物转换成不同的数据类型,对于我未经训练的人来说,使得将.find_next()类型的东西串起来变得更加困难。特别是Kickstarter拥有这些项目,每行4个项目。

关于我如何实现的任何想法:找到第一个项目 - > scrape - >追加数组 - >在下一个项目上重复?

pageGrab = BeautifulSoup(requests.get(url).content, "html.parser") 

link_array = [] 
blurb_array = [] 

links = pageGrab.select('.project-title a') 
blurb = pageGrab.select('.project-blurb') 

for link in links: 
    rel_path = link.get('href') 
    path = urljoin(base_url, rel_path) 
    link_array.append(path) 

for row in blurb: 
    blurb_array.append(row.string.strip()) 

在这里,我一直在通过这些阵列成熊猫数据帧其写入到一个Excel文件。尽管这是一项繁琐的工作,但我对自己感到非常自豪,但这是我第一个有用的程序/脚本!

回答

2

我建议您选择的每个项目的“卡”,其中有类“项目”:

pageGrab.select('.project') 

的选择方法也返回了“汤”,这又可以被搜索到。例如,要查找一个项目的标题:

<project soup>.select_one('.project-title > a').contents[0] 

它选择包含在头部与project-title类的链接元素, 内容属性获取的实际文本(在列表中,因为某些原因)。有关这些方法的更多信息,请参阅the docs

举个例子,得到的第一个项目的名称,你可以做

pageGrab.select('.project')[0].select_one('.project-title > a').contents[0] 

所以,你可以在所有项目“卡”循环和,但是你想收集的信息。

我不确定你是否在为了学习一般的网页抓取而这样做,但如果你想要制作一个合适的应用程序,我推荐使用JSON数据,这样操作起来更容易。 您可以只需添加.json页面URL的末尾,从Kickstarter上的页面获取:

https://www.kickstarter.com/discover/advanced.json?category_id=16&woe_id=0&sort=newest&seed=2479798&page=1

请记住,他们可能会在将来删除此,并没有太多的网站以这样的方式提供了一个API因为这个