机器学习集训营II-第2周 创业邦静态网页爬虫作业


从创业邦网站拉取创业公司数据
入口链接:http://www.cyzone.cn/event/list-764-0-1-0-0-0-0/,要求抓取前30页。
抓取以下信息:公司名称,详情URL,当前融资轮次,投资方和更新时间。

通过实际网页查看,网站总信息属于静态网页,不存在动态加载的问题,所以决定使用工具BeautifulSoup,定位元素选择使用css-selector,个人比较排斥xpath,下一一步一步拆解来来做

怎样实现翻页操作

首先想到翻页怎样去实现,开始想使用js模拟点击操作,但是这样操作可能需要借助selenium webdriver,爬取静态网页使用selenium有点得不偿失,经群里助教老师提示,不同页有不同的url,所以开始查看不同也页码是否具有相同的规律,从起始页开始看,发现list-764-0-1这里与页面一致(ps: 这里还遇到个坑,未名原因导致入口链接不能访问,通过首页进入投资事件,发现起始url变成了http://www.cyzone.cn/event/list-764-0-1/,跳转其他页面后,在跳回第一页时url会变回开始的入口链接),url使用http://www.cyzone.cn/event/list-764-0-X11X-0-0-0-0/

怎样识别元素

1. url解决后,开始是被公司名称、详情url等元素信息,公司名称使用css-selector中class名称进行过滤元素,在实现过程中,详细公司名称感觉更为直观,所以把简称忽略了,导致最后存储数据时发现有的公司名称是空的,才发现有的公司只有简称,并没有详细公司,所以在后面的爬虫工作中需要提前熟悉下网页的数据结构,尽量爬取共性数据,防止后面数据有为空的情况
2. 投资轮数与更新时间没有明确属性可以识别,经林老师提醒,使用nth-of-type来进行识别
以上是我在完成作业时遇到的坑,现在贴上我的实现代码
`import requests
from bs4 import BeautifulSoup
import pandas as pd

BASE_LIB = 'html5lib'

UA = 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.115 Safari/537.36'
HEADERS = {'user-agent':UA}

if __name__ == '__main__':

# req_url = 'http://www.cyzone.cn/event/list-764-0-1-0-0-0-0/'
# resp = requests.get(req_url,headers = HEADERS)
# bs = BeautifulSoup(resp.text,BASE_LIB)
# items = bs.select('tr.table-plate3 > td:nth-of-type(4)')[1].text
# print (items)
# print (cells[10].text)
data = []
for i in range(1,31):
req_url = 'http://www.cyzone.cn/event/list-764-0-%s-0-0-0-0/' %i
resp = requests.get(req_url,headers = HEADERS)
bs = BeautifulSoup(resp.text,BASE_LIB)
items = bs.select('.table-plate3')
# print (items[1].find_all('td')[-2].text)
for i in range(1,len(items)):
temp_cell = items[i].find_all('td')
company_name = bs.select('.tp2_tit')[i].text
company_full_name = bs.select('.tp2_com')[i].text
rounds = bs.select('tr.table-plate3 > td:nth-of-type(4)')[i].text
print(rounds)
amount = bs.select('.money')[i].text
investors = bs.select('.tp3')[i].text.strip()
update_time = temp_cell[-2].text #这里可以换成 bs.select('tr.table-plate3 > td:nth-of-type(7)')[i].text
detail_url = bs.select('.show-detail')[i].get('href')
data.append([company_name,company_full_name,rounds,amount,investors,update_time,detail_url])
columns = ['company_name','company_full_name', 'rounds', 'amount', 'investors', 'update_time', 'detail_url']
df = pd.DataFrame(data,columns = columns)
df.to_csv('E:\Documents/cyzong.csv', mode='a', header=False,
index=False, encoding="gb18030")`
3.
已邀请:

林应

赞同来自: 随风荡荡飘


投资轮数有坑,因为有隐藏单元格存在,可能定位错误,建议定位器写成"td.tp-mean + td",加号用来定位相邻元素。

要回复问题请先登录注册

收藏七月在线,一起向大牛进阶

ctrl+D或command+D可以快速收藏哦~