Python网页爬虫入门指导

优采云 发布时间: 2022-05-08 04:22

  Python网页爬虫入门指导

  以林志玲的百度词条为首页开始爬取。

  第四步,查看源码,

  很多人都知道查看源码的快捷键是F12,不管是谷歌浏览器还是IE浏览器,都是这样,但是当按下F12之后会不由得疑问,"这是什么东西?",令人毫无头绪。

  

  当然,可以一步一步的去了解源码,学习html的知识,然后用正则表达式去一步一步、一个单元一个单元的匹配我们想要的信息,但是这样未免太复杂了,我个人推荐使用检查工具。

  

  爬取内部链接

  指向我们想要了解的元素,

  

  素,鼠标右键->检查,能够快速定位我们关注的元素。

  我觉得到这一步就已经够了,最简单的网页爬虫就是反复的重复以下两个步骤:

  通过检查功能可以看到,百科词条内部链接部分的源码是这样的,

  元素1:

  凯渥模特经纪公司</a><br />

  元素2:

  决战刹马镇</a><br />

  元素3:

  月之恋人</a><br />

  元素4:

  AKIRA</a><br />

  从上述4个元素可以看出,我们想要的信息词条内部链接在标签中,标签中有以下几个属性:

  可以看出,我们想要的信息就在href中,也就是词条的内部链接。因此,我们爬虫的目标就很明确了,就是解析出href超链接。

  到这里,浏览器检查功能已经发挥了它的作用,下一步问题就变成了我们怎么解析出标签中href的链接?

  这时,BeautifulSoup4就派上用场了。

  用BeautifulSoup4解析我们从网页上抓取的html,

  soup = BeautifulSoup(response.text, 'html.parser')<br />

  看到这里也许会疑惑,html.parser是什么?

  这是一种html的解析器,Python中提供几种html解析器,它们的主要特点分别是,

  

  综合来说,我们选取html.parser解析器,

  选取好解析器之后就开始着手匹配我们想要的元素,可是看一下html发现,网页中有很多标签,我们该匹配哪一类呢?

  AKIRA</a><br />

  仔细看一下会发现特点,target="_blank",属性href以/item开头的,于是就有了我们的匹配条件,

  {"target": "_blank", "href": re.compile("/item/(%.{2})+$")}<br />

  用这样的匹配条件去匹配符合target、href要求的标签,

  sub_urls = soup.find_all("a", {"target": "_blank", "href": re.compile("/item/(%.{2})+$")})<br />

  完整代码为,

  def main():<br />    url = BASE_URL + START_PAGE<br />    response = sessions.post(url)<br />    response.encoding = response.apparent_encoding<br />    soup = BeautifulSoup(response.text, 'html.parser')<br />    sub_urls = soup.find_all("a", {"target": "_blank", "href": re.compile("/item/(%.{2})+$")})<br />    for sub_url in sub_urls:<br />        print(sub_url)<br />

  输出结果为,

  幸福额度</a><br />北京·纽约</a><br />多伦多大学</a><br />刺陵</a><br />决战刹马镇</a><br />北京·纽约</a><br />张国荣</a><br />奥黛丽·赫本</a><br />林健寰</a><br />斯特罗恩中学</a><br />多伦多大学</a><br />华冈艺校</a><br />唐安麒</a><br />日本再发*敏*感*词*城武</a><br />......<br />

  在用属性字段sub_url["href"]过滤一下即可,

  /item/%E5%B9%B8%E7%A6%8F%E9%A2%9D%E5%BA%A6<br />/item/%E5%8C%97%E4%BA%AC%C2%B7%E7%BA%BD%E7%BA%A6<br />/item/%E5%A4%9A%E4%BC%A6%E5%A4%9A%E5%A4%A7%E5%AD%A6<br />/item/%E5%88%BA%E9%99%B5<br />/item/%E5%86%B3%E6%88%98%E5%88%B9%E9%A9%AC%E9%95%87<br />/item/%E5%8C%97%E4%BA%AC%C2%B7%E7%BA%BD%E7%BA%A6<br />/item/%E5%BC%A0%E5%9B%BD%E8%8D%A3<br />......<br />

  就得到了词条内部链接的后缀部分,然后和基础的url拼接在一起就是完整的内部链接地址。

  同理,用同样的方法也可以爬取其他内容,比如糗事百科的笑话、专业网站的素材、百度百科的词条,当然,有些文本信息比较杂乱,这个过程中需要一些信息的筛选过程,例如利用正则表达式来匹配一段文本中有价值的信息,方法与上述大同小异。

  下载图片

  

  和爬取内部链接一样,要善于利用浏览器的检查功能,检查一下词条内部图片的链接,

  <br />

  发现,图片链接存放在标签内部,用上述方法可以匹配到图片的完整链接,

  response = sessions.post(url)<br />response.encoding = response.apparent_encoding<br />soup = BeautifulSoup(response.text, "html.parser")<br />image_urls = soup.find_all("img", {"class": "picture"})<br />for image_url in image_urls:<br />    print(image_url["src"])<br />

  输出如下,

  https://gss2.bdstatic.com/9fo3dSag_xI4khGkpoWK1HF6hhy/baike/s%3D220/sign=36dbb0f7e1f81a4c2232ebcbe7286029/a2cc7cd98d1001e903e9168cb20e7bec55e7975f.jpg<br />https://gss2.bdstatic.com/-fo3dSag_xI4khGkpoWK1HF6hhy/baike/s%3D220/sign=85844ee8de0735fa95f049bbae500f9f/dbb44aed2e738bd49d805ec2ab8b87d6267ff9a4.jpg<br />...<br />

  然后用requests发送请求,获取图片的数据,然后以读写文件的方式存储到本地,

  for image_url in image_urls:<br />    url = image_url["src"]<br />    response = requests.get(url, headers=headers)<br />    with open(url[-10:], 'wb') as f:<br />        f.write(response.content)<br />

  除了requests之外,还可以使用urllib.request.urlretrieve下载图片,urlretrieve相对要方便一些,但是对于大文件,requests可以分段读写,更具有优势。

  上述介绍的方法是比较简单的一种,如果精力有限也可以尝试一下Selenium或者Scrapy,这两款工具的确非常强大,尤其是Selenium,它本是一款自动化测试工具,但是后来发现它同样可以用于网页爬虫,让浏览器帮助你自动爬取数据的工具,它可以以用户访问网页类似的行为去浏览网页并抓取数据,非常高效,感兴趣的可以尝试一下。

  福利

  

  我整理了一些计算机视觉、Python、强化学习、优化算法等方面的电子书籍、学习资料,同时还打包了一些我认为比较实用的工具,如果需要请关注公众号,回复相应的关键字即可获取~

  

  发现更多精彩

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线