# 简单爬虫基础

简单爬虫基础

概述

  1. 网络爬虫(又被称为网页蜘蛛,网络机器人,在FOAF社区中间,更经常的称为网页追逐者),是一种按照一定的规则,自动地抓取万维网信息的程序或者脚本。另外一些不常使用的名字还有蚂蚁、自动索引、模拟程序或者蠕虫。

  2. 爬虫的基本步骤是

    1. 找到网站的入口
    2. 解析网站的html提取信息
    3. html中有许多不同的a连接,使用同样的方式,进入连接中去爬去不同的网页代码
  3. 爬虫需要用到的工具

    1. 我们需要一个url解析的工具
    2. 需要一个请求html网页的工具
    3. 需要一个解析html代码的工具

软件安装

  1. requests库 用于请求网页

    pip install requests
    
  2. bs4库 用于解析html 类似于dom

    pip install beautifulsoup4
    pip install lxml
    
requests库,常用命令:
	response.url:返回请求网站的URL
	response.status_code:返回响应的状态码
	response.encoding:返回响应的编码方式
	response.headers:返回的响应头信息(dict类型)
	response.content:返回的响应体(bytes类型)
	response.text:返回的响应体(str类型),相当于 response.content.decode('utf-8')
	response.json():返回的响应体(json类型),相当于 json.loads(response.text)
from bs4 import BeautifulSoup
import requests

res = requests.get(url).text
标签的选择方法
	soup = BeutifulSoup(res,'lxml')
	soup.p.attrs['name']#可以获得皮标签的name属性的值
	soup.div.p.string#div标签下p标签的字符串
	soup.p.children#p标签下所有子节点,返回是一个迭代器
	soup.p.descendants#p标签下所有子孙节点,比如p的子节点下还有子节点,
	这个方法可以把这些节点都选中
	soup.p.parent#p标签的父节点。
	soup.p.parents#p节点的祖先节点
	soup.p.next_siblings#p标签的下面的兄弟节点
	soup.p.previous_siblings#p标签上面的兄弟节点
带有属性的选择方法
	soup.find_all('p')#选择所有p标签
	soup.find_all(attrs={'id':'xxx'})#选择所有ID属性值XXX
	soup.find_all('p',attrs={'id':'xxx'})#选择p标签中id属性值为xxx的所有内容

css选择器
	soup.select('.xxx')#class为xxx的所有内容
	soup.select('div p')#div标签下的p标签
	soup.select('#xxxx')#id为xxx的内容
	soup.select('div,li')#选择div,li标签

爬虫示例

import requests
from bs4 import BeautifulSoup


def get_html_doc(url):		
    res = requests.get(url) 			 # 根据指定的url获取html文档,bytes类型
    return res.content.decode("utf8")			#这里也可以直接return res.text


if __name__ == "__main__":
    url = "http://blog.jobbole.com/all-posts/"
    a = get_html_doc(url)		
    print(a)
    data = BeautifulSoup(a)  # 解析指定网页
    print(data)				#打印解析

response.text 和response.content的区别

    response.text 
    类型:str 
    解码类型:根据HTTP头部对响应的编码做出有根据的推测,推测的文本编码 
    如何修改编码方式:response.encoding=”gbk”
    resp.text返回的是Unicode型的数据。

	resp.content返回的是bytes型也就是二进制的数据 
    response.content 
    类型:bytes 
    解码类型:没有指定 
    如何修改编码方式:response.content.decode(“utf8”)

直接输出content,会发现前面存在b'这样的标志,这是字节字符串的标志,而text是,没有前面的b,对于纯ascii码,
这两个可以说一模一样,对于其他的文字,需要正确编码才能正常显示。大部分情况建议使用.text,
因为显示的是汉字,但有时会显示乱码,这时需要用.content.decode('utf-8'),中文常用utf-8和GBK,GB2312等。
这样可以手工选择文字编码方式。
1. 我们把url交给request去请求html文档
2. 把html文档传递给 BeautifulSoup去加载
3. data就有了类似于js dom树的功能
  1. 复杂的爬虫

    我们需要遍历所有的文章,经过观察,我们发现,伯乐在线有一个index的页面,页面中展示每篇文章的标题和概述,点击进去才有详细的文章。我们可以通过爬去index页面,获取详细页面的url。再爬去详细页面的url,这样去爬取整个网站的文章

    1. 实验第一步,爬去文章列表页,然后把列表页的url提取出来,再爬去详细文章页面
import requests  # 用于请求网页
from bs4 import BeautifulSoup  # 网页分析,查找标签和元素


def get_html_doc(url):
    res = requests.get(url)  # 根据指定的url获取html文档  字节流 bytes类型
    print(res.content)
    return res.content.decode("utf8")  # 解码为str


if __name__ == "__main__":
    url = "http://blog.jobbole.com/category/it-tech/"
    a = get_html_doc(url)
    data = BeautifulSoup(a)  # 把index里面的url取出来再取下面的ur
    urls = data.select('[class=post-thumb] a')  # data.select调用css选择器 选择出来是dict

    for i in urls:       #遍历urls
        url = i['href']     # i为字典(dict),通过key-value 键值对获取url
        get_html_doc(url)   #再将url 传入页面分析
  1. 根据列表页面中的url无限获取

    1. 指定一个入口url
    2. 通过入口url获取index页面
    3. 通过index的url解析子页面
    4. 通过index中的其他跳转页面获取其他index页面
    
    import requests   				#用于请求网页
    from bs4 import BeautifulSoup	#网页分析,查找标签和元素
    
    index_urls_list = []       #用来除去重复网页url
    
    
    def get_html_doc(url):
        # 根据指定的url获取html文档
        res = requests.get(url)
        print(res.content)
        return res.content.decode("utf8")  #utf8解码显示
    
    
    def parse_index(url):
        # 解析列表页面
        html_doc = get_html_doc(url)
        data = BeautifulSoup(html_doc)
        # 把index里面的url取出来再取下面的url
        # data.select调用css选择器 选择出来是dict
        detail_urls = data.select('[class=post-thumb] a')
    
        for i in detail_urls:
            url = i['href']		#遍历取出url
            get_html_doc(url)		#传递url给get_html_doc函数处理
        # 取出所有其他index页面的翻页url 去解析其他的url
        index_urls = data.select('a[class=page-numbers]')
        for i in index_urls:
            if i not in index_urls_list:		#判断url是否重复
                index_urls_list.append(i)		#不重复则添加
                url = i['href']				#字典取value值 即url连接
                parse_index(url)			#再将url返回给parse_index处理
    
    
    def start(url):				#开启
        parse_index(url)			
    
    
    if __name__ == "__main__":
        url = "http://blog.jobbole.com/category/it-tech/"
        start(url)
    
    
    

你可能感兴趣的:(Python)