Python爬虫实战系列文章目录Python爬虫实战:东方财富网股吧数据爬取(一) 前言朋友托我写个爬虫,本身是个爬虫小白的我还是接受了此次重任,总共历时五天左右,过程中遇到过无数bug,好在一路披荆斩棘,还是大差不差的完成了此次委托!但感觉这次的经历还是有必要和大家分享一下,正好最近也没有写博文了,趁这次机会赶赶进度! 一、项目说明项目需求:股吧中人们的言论行为和股市涨跌的延迟相关性 二、实施过程以东方财富吧为例 1.明确获取网页中哪些数据我们需要爬取的是东方财富吧中全部发帖信息的阅读、评论、标题、作者及最后更新时间这五个字段的数据,我一开始想也不是很难,解析一下网页匹配一下对应的标签值就可以了,但后面还是出现了各种各样的问题,需要大家注意一下。 2.查看网页源代码分析结构① 网页源代码首先打开网页的开发者工具(Ctrl+Shift+i),在源代码中查找对应字段的标签结构。
② 网页链接【东方财富吧:300059】 I.全部个股吧的数字代码
如何得到不同股吧的所有翻页数据,着实让我找了好久,各种资源我都找了可惜还是没有发现,突然无意之中我找到了解决办法,我直接一个好家伙! 跟上述的五类字段一样,我们查看一下页数的代码字段,如下图所示: 300059:股吧数字代码452885:该股吧共发帖452885条 80:每个页面分别有80条贴子 2:当前所处页面为第2页 那么这时候,我们就可以直接用累积多年的算力(小学除法)算出东方财富吧共有 3.爬虫需要具备的功能基本问题解决了,我们可以开始编写爬虫了。这部分不讲代码原理,只解释代码功能。自己也是小白,如果代码存在问题或不清楚的话,欢迎大家在下方留言,我一定及时回复。 ① 获取网页源代码 def getHTMLText(url):try:r = requests.get(url, timeout=30)r.raise_for_status()r.encoding = r.apparent_encodingreturn r.textexcept:print("获取网页内容失败!") ② 解析网页并提取数据字段 def parsePage(html):list = [] # 我用的二维数组存储read = []comment = []title = []author = []time = []try:# print(html)soup = BeautifulSoup(html, "html.parser")for each in soup.find_all('span', 'l1 a1'):if '万' in each.string:each.string = each.string[:-2]read.append(each.string)read = read[1:] # read[0] == '阅读'list.append(read)for each in soup.find_all('span', 'l2 a2'):comment.append(each.string)comment = comment[1:] # comment[0] == '评论'list.append(comment)for each in soup.find_all('span', 'l3 a3'):first = each.select('a:nth-of-type(1)')for i in first:i.find_all("a")# print(i.title)title.append(i.title)list.append(title)for each in soup.find_all('span', 'l4 a4'):first = each.select('font:nth-of-type(1)')for i in first:i.find_all("font")# print(i.title)author.append(i.title)list.append(author)for each in soup.find_all('span', 'l5 a5'):time.append(each.string)time = time[1:] # time[0] == '最后更新'list.append(time)except:print("解析网页字段失败!")return list ③ 获取贴吧总页数 基于解析的网页直接find_all也是可以的def get_total_pages_num(url):try:chrome_options = webdriver.ChromeOptions()chrome_options.add_argument('--headless')chrome_options.add_argument('lang=zh_CN.UTF-8')chrome_options.add_argument('User-Agent="Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.162 Safari/537.36"')chrome_options.add_argument('--disable-extensions')chrome_options.add_argument('--disable-gpu')chrome_options.add_argument('--no-sandbox')driver = webdriver.Chrome(options=chrome_options)driver.get(url)page_data = driver.find_element_by_xpath('//div[@id="mainbody"]/div[@id="articlelistnew"]/div[@class="pager"]/span[@class="pagernums"]').get_attribute('data-pager')# print(page_data)if page_data:# page_nums = re.findall('\|(\d+)', page_data[0])page_nums = page_data.split("|")# print(page_nums)total_pages = math.ceil(int(page_nums[1]) / int(page_nums[2]))driver.quit()except Exception as e:total_pages = 1return int(total_pages) 4.爬取结果上述代码基本的字段已经可以实现爬取了,结果如下:
总结在爬取过程中,我还遇到了很多问题诸如: |
|