左侧部门列表每点击一次都有一个新的js网页出现,Request URL可以明确看出网址,且每个网址都有其规律:
点击了三个部门,返回的网址如下,可以看出是有规律的,此处deptid正是对应于下图中的<span>内容:
这种倒推的思路,首先要做的就是部门的id提取出来,然后匹配成Request URL去获取js页,需要的id就在下面:
<li>
<span>
<a href="javascript:changebm('130110022')" id="130110022" title="鹿泉区国土资源局">
区国土局
</a>
</span>
<span>
<a href="javascript:changebm('130110023')" id="130110023" title="鹿泉区农业畜牧局">
区农牧局
</a>
此处有分页的信息,但是用BeautifulSoup解析url得到的内容不全:
解决办法:
1.原因是代码附在一个json里面的,并非写死在html里面的,chrome上显示的和传过来的源码不一样,我把json解析出来,然后再用BeautifulSoup解析就好了。
2.估计Ajax动态加载的,看network
是否有Ajax
请求。bs只是用来解析html/xml代码。
在你获取网页内容时没获取到js动态加载的内容(比如document.write啥的),用什么解析器都一样。
尝试动态爬虫工具,常见的有selenium
,还有dryscrape
,ghost.py
其他可能出现解析不全的原因:
参考beautifulsoup网址:https://www.crummy.com/software/BeautifulSoup/bs4/doc/index.zh.html#id9
1.将soup = BeautifulSoup(res.text,"lxml")
改为html = BeautifulSoup(result,"html.parser") #因为使用'lxml'会导致内容丢失,故此使用'html.parser'
检查过HTML无残缺标签或提前闭合,最后使用html.parse替代lxml解决问题,怀疑是解析器兼容性导致
2.soup.find_all()找不到a标签,然而用chrome查看该网站源码是存在a标签的,gethtml(源码就不贴了)函数运作也没问题,单独打印soup发现只解析了部分html代码.
问题的原因:没有安装第三方的HTML解析器,所以用的是默认的解析器。而Python 2.7.3的默认解析器存在文档容错能力差的毛病。解决方法: pip install html5lib (或者 lxml)
反爬措施出现,破之!:
爬到的数据一部分:
初步清洗空元素之后的数据:
对应上图爬到的法定办结时限(工作日、承诺办结时限(工作日)两个数据,直接取
正则匹配之后替换脏数据就可以了(此处为无图片网页):
接下来爬取带有图片的网页:
url为带中文的,需要特殊处理
至此,所有的数据都已经爬取到!