Python系统学习-27

http://www.xiaobaibook.com/details/52/

https://www.cnblogs.com/bobo-zhang/-------爬虫老师

  1. 爬虫开发基础
    1.1为什么要使用requests模块
    因为在使用urllib模块的时候,会有诸多不便之处,总结如下:
    手动处理url编码
    手动处理post请求参数
    处理cookie和代理操作繁琐

    使用requests模块:
    自动处理url编码
    自动处理post请求参数
    简化cookie和代理操作

1.2数据爬取的流程:

  • 指定url
  • 基于requests模块发起请求
  • 获取响应中的数据
  • 数据解析
  • 进行持久化存储

1.3三种数据解析方式:

  • 正则表达式
  • xpath
  • BeautifulSoup解析

1.4Xpath
属性定位:
#找到class属性值为song的div标签
//div[@class=“song”]
层级&索引定位:
#找到class属性值为tang的div的直系子标签ul下的第二个子标签li下的直系子标签a
//div[@class=“tang”]/ul/li[2]/a
逻辑运算:
#找到href属性值为空且class属性值为du的a标签
//a[@href="" and @class=“du”]
模糊匹配:
//div[contains(@class, “ng”)]
//div[starts-with(@class, “ta”)]
取文本:
# /表示获取某个标签下的文本内容
# //表示获取某个标签下的文本内容和所有子标签下的文本内容
//div[@class=“song”]/p[1]/text()
//div[@class=“tang”]//text()
取属性:
//div[@class=“tang”]//li[2]/a/@href

1.4.1Xpath实例
1.下载:pip install lxml
2.导包:from lxml import etree

3.将html文档或者xml文档转换成一个etree对象,然后调用对象中的方法查找指定的节点

2.1 本地文件:tree = etree.parse(文件名)
tree.xpath(“xpath表达式”)

2.2 网络数据:tree = etree.HTML(网页内容字符串)
tree.xpath(“xpath表达式”)
安装xpath插件在浏览器中对xpath表达式进行验证:可以在插件中直接执行xpath表达式
将xpath插件拖动到谷歌浏览器拓展程序(更多工具)中,安装成功

启动和关闭插件 ctrl + shift + x

项目需求:获取好段子中段子的内容和作者 http://www.haoduanzi.com

from lxml import etree
import requests

url=‘http://www.haoduanzi.com/category-10_2.html
headers = {
‘User-Agent’: ‘Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.181 Safari/537.36’,
}
url_content=requests.get(url,headers=headers).text
#使用xpath对url_conten进行解析
#使用xpath解析从网络上获取的数据
tree=etree.HTML(url_content)
#解析获取当页所有段子的标题
title_list=tree.xpath(’//div[@class=“log cate10 auth1”]/h3/a/text()’)

ele_div_list=tree.xpath(’//div[@class=“log cate10 auth1”]’)

text_list=[] #最终会存储12个段子的文本内容
for ele in ele_div_list:
#段子的文本内容(是存放在list列表中)
text_list=ele.xpath(’./div[@class=“cont”]//text()’)
#list列表中的文本内容全部提取到一个字符串中
text_str=str(text_list)
#字符串形式的文本内容防止到all_text列表中
text_list.append(text_str)
print(title_list)
print(text_list)

1.5Beautiful soap

  • 需要将pip源设置为国内源,阿里源、豆瓣源、网易源等
    • windows
      (1)打开文件资源管理器(文件夹地址栏中)
      (2)地址栏上面输入 %appdata%
      (3)在这里面新建一个文件夹 pip
      (4)在pip文件夹里面新建一个文件叫做 pip.ini ,内容写如下即可
      [global]
      timeout = 6000
      index-url = https://mirrors.aliyun.com/pypi/simple/
      trusted-host = mirrors.aliyun.com
    • linux
      (1)cd ~
      (2)mkdir ~/.pip
      (3)vi ~/.pip/pip.conf
      (4)编辑内容,和windows一模一样
  • 需要安装:pip install bs4
    bs4在使用时候需要一个第三方库,把这个库也安装一下
    pip install lxml
    基础使用

使用流程:
- 导包:from bs4 import BeautifulSoup
- 使用方式:可以将一个html文档,转化为BeautifulSoup对象,然后通过对象的方法或者属性去查找指定的节点内容
(1)转化本地文件:
- soup = BeautifulSoup(open(‘本地文件’), ‘lxml’)
(2)转化网络文件:
- soup = BeautifulSoup(‘字符串类型或者字节类型’, ‘lxml’)
(3)打印soup对象显示内容为html文件中的内容

基础巩固:
(1)根据标签名查找
- soup.a 只能找到第一个符合要求的标签
(2)获取属性
- soup.a.attrs 获取a所有的属性和属性值,返回一个字典
- soup.a.attrs[‘href’] 获取href属性
- soup.a[‘href’] 也可简写为这种形式
(3)获取内容
- soup.a.string
- soup.a.text
- soup.a.get_text()
【注意】如果标签还有标签,那么string获取到的结果为None,而其它两个,可以获取文本内容
(4)find:找到第一个符合要求的标签
- soup.find(‘a’) 找到第一个符合要求的
- soup.find(‘a’, title=“xxx”)
- soup.find(‘a’, alt=“xxx”)
- soup.find(‘a’, class_=“xxx”)
- soup.find(‘a’, id=“xxx”)
(5)find_all:找到所有符合要求的标签
- soup.find_all(‘a’)
- soup.find_all([‘a’,‘b’]) 找到所有的a和b标签
- soup.find_all(‘a’, limit=2) 限制前两个
(6)根据选择器选择指定的内容
select:soup.select(’#feng’)
- 常见的选择器:标签选择器(a)、类选择器(.)、id选择器(#)、层级选择器
- 层级选择器:
div .dudu #lala .meme .xixi 下面好多级
div > p > a > .lala 只能是下面一级
【注意】select选择器返回永远是列表,需要通过下标提取指定的对象
需求:使用bs4实现将诗词名句网站中三国演义小说的每一章的内容爬去到本地磁盘进行存储 http://www.shicimingju.com/book/sanguoyanyi.html

import requests
from bs4 import BeautifulSoup

headers={
‘User-Agent’: ‘Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36’,
}
def parse_content(url):
#获取标题正文页数据
page_text = requests.get(url,headers=headers).text
soup = BeautifulSoup(page_text,‘lxml’)
#解析获得标签
ele = soup.find(‘div’,class_=‘chapter_content’)
content = ele.text #获取标签中的数据值
return content

if name == “main”:
url = ‘http://www.shicimingju.com/book/sanguoyanyi.html
reponse = requests.get(url=url,headers=headers)
page_text = reponse.text

 #创建soup对象
 soup = BeautifulSoup(page_text,'lxml')
 #解析数据
 a_eles = soup.select('.book-mulu > ul > li > a')
 print(a_eles)
 cap = 1
 for ele in a_eles:
     print('开始下载第%d章节'%cap)
     cap+=1
     title = ele.string
     content_url = 'http://www.shicimingju.com'+ele['href']
     content = parse_content(content_url)

     with open('./sanguo.txt','w') as fp:
         fp.write(title+":"+content+'\n\n\n\n\n')
         print('结束下载第%d章节'%cap)

1.6requests模块的cookie和代理操作
‘’’
使用透明代理,对方服务器可以知道你使用了代理,并且也知道你的真实IP。
使用匿名代理,对方服务器可以知道你使用了代理,但不知道你的真实IP。
使用高匿名代理,对方服务器不知道你使用了代理,更不知道你的真实IP
‘’’

import requests

headers = {
	'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36'
}
url = 'https://www.baidu.com/s?wd=ip'

page_text = requests.get(url=url, headers=headers, proxies={'https': '123.1.150.244:80'}).text
with open('./ip.html', 'w', encoding='utf-8') as fp:
	fp.write(page_text)
  • cookie概念:当用户通过浏览器首次访问一个域名时,访问的web服务器会给客户端发送数据,以保持web服务器与客户端之间的状态保持,这些数据就是cookie。

  • cookie作用:我们在浏览器中,经常涉及到数据的交换,比如你登录邮箱,登录一个页面。我们经常会在此时设置30天内记住我,或者自动登录选项。那么它们是怎么记录信息的呢,答案就是今天的主角cookie了,Cookie是由HTTP服务器设置的,保存在浏览器中,但HTTP协议是一种无状态协议,在数据交换完毕后,服务器端和客户端的链接就会关闭,每次交换数据都需要建立新的链接。就像我们去超市买东西,没有积分卡的情况下,我们买完东西之后,超市没有我们的任何消费信息,但我们办了积分卡之后,超市就有了我们的消费信息。cookie就像是积分卡,可以保存积分,商品就是我们的信息,超市的系统就像服务器后台,http协议就是交易的过程。

  • 经过cookie的相关介绍,其实你已经知道了为什么上述案例中爬取到的不是张三个人信息页,而是登录页面。那应该如何抓取到张三的个人信息页呢?

思路:

1.我们需要使用爬虫程序对人人网的登录时的请求进行一次抓取,获取请求中的cookie数据

2.在使用个人信息页的url进行请求时,该请求需要携带 1 中的cookie,只有携带了cookie后,服务器才可识别这次请求的用户信息,方可响应回指定的用户信息页数据

import requests
if __name__ == "__main__":

    #登录请求的url(通过抓包工具获取)
    post_url = 'http://www.renren.com/ajaxLogin/login?1=1&uniqueTimestamp=201873958471'
    #创建一个session对象,该对象会自动将请求中的cookie进行存储和携带
    session = requests.session()
   #伪装UA
    headers={
        'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36',
    }
    formdata = {
        'email': '17701256561',
        'icode': '',
        'origURL': 'http://www.renren.com/home',
        'domain': 'renren.com',
        'key_id': '1',
        'captcha_type': 'web_login',
        'password': '7b456e6c3eb6615b2e122a2942ef3845da1f91e3de075179079a3b84952508e4',
        'rkey': '44fd96c219c593f3c9612360c80310a3',
        'f': 'https%3A%2F%2Fwww.baidu.com%2Flink%3Furl%3Dm7m_NSUp5Ri_ZrK5eNIpn_dMs48UAcvT-N_kmysWgYW%26wd%3D%26eqid%3Dba95daf5000065ce000000035b120219',
    }
    #使用session发送请求,目的是为了将session保存该次请求中的cookie
    session.post(url=post_url,data=formdata,headers=headers)

    get_url = 'http://www.renren.com/960481378/profile'
    #再次使用session进行请求的发送,该次请求中已经携带了cookie
    response = session.get(url=get_url,headers=headers)
    #设置响应内容的编码格式
    response.encoding = 'utf-8'
    #将响应内容写入文件
    with open('./renren.html','w') as fp:
        fp.write(response.text)

1.7selenuim和phantonJs处理网页动态加载数据的爬取

-为什么使用selenium在爬虫中?
因为有些数据是懒加载,只有执行某些操作后才能加载数据,所以需要selenium。

1.7.1phantomJs

  • PhantomJS是一款无界面的浏览器,其自动化操作流程和上述操作谷歌浏览器是一致的。由于是无界面的,为了能够展示自动化操作流程,PhantomJS为用户提供了一个截屏的功能,使用save_screenshot函数实现。

  • 重点(phantomjs已经不维护):selenium+phantomjs 就是爬虫终极解决方案:有些网站上的内容信息是通过动态加载js形成的,所以使用普通爬虫程序无法回去动态加载的js内容。例如豆瓣电影中的电影信息是通过下拉操作动态加载更多的电影信息

1.8谷歌无头浏览器

from selenium import webdriver
from selenium.webdriver.chrome.options import Options
import time
 
# 创建一个参数对象,用来控制chrome以无界面模式打开
chrome_options = Options()
chrome_options.add_argument('--headless')
chrome_options.add_argument('--disable-gpu')
# 驱动路径
path = r'C:\Users\ZBLi\Desktop\1801\day05\ziliao\chromedriver.exe'
 
# 创建浏览器对象
browser = webdriver.Chrome(executable_path=path, chrome_options=chrome_options)
 
# 上网
url = 'http://www.baidu.com/'
browser.get(url)
time.sleep(3)
 
browser.save_screenshot('baidu.png')
 
browser.quit()

猜你喜欢

转载自blog.csdn.net/weixin_41765871/article/details/85015227
今日推荐