为什么是轻量级爬虫?因为复杂的爬虫需要考虑的场景和问题非常的多,比如有些网页需要登录后才能访问、而有些网页使用javascript异步加载完成。轻量级爬虫爬取的是不需要登录的静态网页抓取。
首先需要一个爬虫调度端,来启动爬虫、停止爬虫、或者监视爬虫的运行情况。在爬虫架构中有三个模块:
管理待抓取URL集合和已抓取URL集合,防止重复抓取、循环抓取。
将互联网上URL对应的网页下载到本地的工具
爬取百度首页就出错。。。试了几种方法,只有(‘gbk’,‘ignore’)有用,并且是偶尔正常显示。爬取其他网页就很顺利,不知道是百度厉害,还是代码太low。最终解决,在第一行添加如下代码即可。。。不过也是是好是坏。
# -*- coding: UTF-8 -*-
或
#coding=utf-8
HTTPCookieProcessor,ProxyHandler,HTTPHandler,HTTPRedirectHandler生成handler
# -*- coding: UTF-8 -*-
import urllib.request
from http import cookiejar
url = "http://www.baidu.com"
print("第一种方法")
response1 = urllib.request.urlopen(url)
print(response1.getcode())
print(len(response1.read()))
print("第二种方法")
request=urllib.request.Request(url)
request.add_header("user-agent","Mozilla/5.0")
response2=urllib.request.urlopen(request)
print(response2.getcode())
print (len(response2.read()))
print("第三种方法")
cj=cookiejar.CookieJar()
opener=urllib.request.build_opener(urllib.request.HTTPCookieProcessor(cj))
urllib.request.install_opener(opener)
response3=urllib.request.urlopen(url)
print(response3.getcode())
print(cj)
print(response3.read())
从网页中提取有价值的数据的工具
可以import bs4即安装成功。查看官方文档
创建Beautifulsoup对象,搜索节点find_all、find(参数一样),访问节点名称、属性、文字
例如:
python
节点名称:a
节点属性:href='123.html' class='article_link'
节点内容:python
#创建
soup = BeautifulSoup(html_cont, 'html.parser',from_encoding='utf-8')
#查找节点a
soup.find_all('a')
#查找节点a,链接符合/view/123.html形式的节点
soup.find_all('a',herf='/view/123.html')
soup.find_all('a',herf=re.compile(r'/view/\d+\.html'))#可以用正则表达式替代
#查找节点div,class为abc,文字为python的节点
node = soup.find_all('div',class_='abc', string='python')
#访问节点信息
node.name #标签名称
node['href'] #标签属性
node.get_text() #文字内容
# coding=utf8
from bs4 import BeautifulSoup
import re
html_doc = """
The Dormouse's story
The Dormouse's story
Once upon a time there were three little sisters; and their names were
Elsie,
Lacie and
Tillie;
and they lived at the bottom of a well.
...
"""
soup = BeautifulSoup(html_doc, 'html.parser')
print("打印所有内容")
links = soup.find_all('a')
for link in links:
print(link.name, link['href'], link.get_text())
print("获取lacie的连接")
link_node = soup.find('a',href="http://example.com/lacie")
print(link_node.name, link_node['href'], link_node.get_text())
print("正则匹配")
link_node = soup.find('a',href=re.compile(r"ill"))
print(link_node.name, link_node['href'], link_node.get_text())
print("获取段落文字")
p_node = soup.find('p',class_="title")
print(p_node.name, p_node.get_text())
- 目标:百度百科python词条相关词条网页-标题和简介
- 入口页:https://baike.baidu.com/item/Python/407313
- url格式:/item/接口/15422203
- 数据格式:
- 标题 ...
...
- 简介 ...
- 页面编码:UTF-8
查看代码