抓取动态网页(如何用python自带urllib2库打开网页的爬虫实现之旅?)
优采云 发布时间: 2021-09-18 22:21抓取动态网页(如何用python自带urllib2库打开网页的爬虫实现之旅?)
一、背景
记录一次周末赶回家的爬行动物实现之旅。受他人委托,我想从这一页的明星名单上爬下来。当你在chrome中打开它时,实际上有1000条记录。然后单击“右键菜单”->;“检查”查看网页的结构,这并不特别复杂。因此,我直观地看到,只要我用Python自己的urlib2库打开网页,获取HTML代码,然后将其交给beautiful soup库解析HTML代码,我就应该能够快速完成
但是当你仔细看的时候,点击下一页,网页的URL不会改变。您只需使用js加载新数据,然后动态更改表中的数据。这与本盘的上一页不同,因此这次我们应该找到一种模拟翻页的方法,然后重新阅读新的HTML代码并对其进行分析
实现翻页有两种方法。首先是分析JS的实现,以模拟翻页。翻页操作实际上是JS向后台发送请求。在这里,它必须请求具有跳转目标页码的背景,然后获取新数据并重新呈现HTML的表部分。这种方法效率更高,但难度更大。因为如果您可以模拟请求,这意味着您已经知道其他人的服务器接口。然后,您可以通过进一步分析响应得到结果。你甚至不需要分析HTML代码,是吗?第二个相对简单的方法,也是我在这里使用的方法,是模拟单击web页面中的“下一页”按钮,然后重新读取HTML代码进行解析
二、ideas
如前所述,此处处理该想法:
在这里,打开和阅读网页的HTML代码是通过selenium实现的
解析HTML代码是通过Beauty soup实现的
三、implementation1.相关库的准备和安装
我使用Mac,因此我可以使用easy Direct_uuInstall命令行安装
1
sudo easy_install beautifulsoup4
或简易安装命令
1
sudo easy_install selenium
在这里,selenium版本已经到达3.0.2,如果要使用此版本的selenium打开网页,则需要使用相应的驱动程序。所以我需要安装一个驱动程序
我在这里使用自制安装的chromediver。安装后,请记住查找chromediver的安装目录。我们将在编写下面的代码时使用它
1
brew install chromedirver
注意:Mac下有许多软件管理包。除了我的安装方法,你可以用pip安装它们,或者直接从官方网站下载安装程序。但您必须安装上述三个程序。在这里我突然有了一个想法。老实说,如果Python拥有与gradle相同的构建管理工具,我现在花在安装这些依赖库上的时间比写代码要多
2.分析页面
只需发布我想要爬升的网页的HTML代码的一部分,在其中我使用//写一些评论:
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152
// 本周排行榜,这是我要抓的内容 排名 明星 鲜花数 TOP粉丝 1 // 这个td标签,star-name的css class是我要抓的内容 王俊凯 1790892 送花 1183*****630 2185*****759 3wx526298988 ...此处省略巨量代码... // 这里是本周排行榜分页的html代码,可以看到一页20个明星,共有50页 首页 尾页// 下面开始就是“上周排行榜”,html结构和上面完全类似...此处再次省略巨量代码...
3.完整代码
1234567891011121314151617181920212223242526272829303132333435
import sysimport urllib2import timefrom bs4 import BeautifulSoupfrom selenium import webdriverreload(sys)sys.setdefaultencoding('utf8') # 设置编码url = 'http://baike.baidu.com/starrank?fr=lemmaxianhua'driver = webdriver.Chrome('/usr/local/Cellar/chromedriver/2.20/bin/chromedriver') # 创建一个driver用于打开网页,记得找到brew安装的chromedriver的位置,在创建driver的时候指定这个位置driver.get(url) # 打开网页name_counter = 1page = 0;while page < 50: # 共50页,这里是手工指定的 soup = BeautifulSoup(driver.page_source, "html.parser") current_names = soup.select('div.ranking-table') # 选择器用ranking-table css class,可以取出包含本周、上周的两个table的div标签 for current_name_list in current_names: # print current_name_list['data-cat'] if current_name_list['data-cat'] == 'thisWeek': # 这次我只想抓取本周,如果想抓上周,改一下这里为lastWeek即可 names = current_name_list.select('td.star-name > a') # beautifulsoup选择器语法 counter = 0; for star_name in names: counter = counter + 1; print star_name.text # 明星的名字是a标签里面的文本,虽然a标签下面除了文本还有一个与文本同级别的img标签,但是.text输出的只是文本而已 name_counter = name_counter + 1; driver.find_element_by_xpath("//a[contains(text(),'下一页')]").click() # selenium的xpath用法,找到包含“下一页”的a标签去点击 page = page + 1 time.sleep(2) # 睡2秒让网页加载完再去读它的html代码print name_counter # 共爬取得明星的名字数量driver.quit()
四、总结
这里只简单记录了一个稍微复杂一点的网页爬行的实现思想。硒和beatifulsoup有很多用法,我没有仔细阅读。这里有一些参考资料。将来有机会我会学到更多