day130-day132requests+selenium&线程池&scrapy安装

2020-05-06 17:59:54 浏览数 (1)

1.requests简单爬虫

1.1依赖第三方工具

代码语言:javascript复制
# pip install requests
# pip install lxml

1.2lxml的xpath解析

代码语言:javascript复制
from lxml import etree

# 获取页面文本
web_response = requests.get(web_url, web_headers)
web_response.encoding = 'utf8'
web_text = web_response.text
代码语言:javascript复制
# 生成 etree 对象
web_tree = etree.HTML(web_text)
代码语言:javascript复制
# etree 对象进项 xpath 解析,返回一个列表
free_tags = web_tree.xpath('//div[@id="container"]/div/a')

1.3注意点,xpath 解析,返回一个列表

[0] # 取到某一个属性值

代码语言:javascript复制
# [0],主要不要混乱
free_tags = web_tree.xpath('//div[@id="container"]/div/a/@href')[0]

./ # xpath 表达式定位之后再定位

代码语言:javascript复制
test_fa_ele = web_tree.xpath('//div[@id="xxx"]/div')

# 基于 test_fa_ele 之后再定位到下面的 a 标签下的 href 属性值
test_son_ele = test_ele.xpath('./a/@href')

/ 和 // # 获取标签下一段文本以 和 全部文本

代码语言:javascript复制
# 仅仅获取 span 标签下的文本
test_son_ele = test_ele.xpath('./span/text()')
代码语言:javascript复制
# 只要是在该 div 标签下的文本,全部获取,包含 div 下的子标签的文本也会获取过来
test_son_ele = test_ele.xpath('./span//text()')

| # xpath 解析接受多个 xpath 表达式

代码语言:javascript复制
test_ele = web_tree.xpath('//div[@id="xxx"]/div' | '//div[@id="yyy"]/div')

解决乱码的万能处理方法

代码语言:javascript复制
# 现在解析出来的部分文字是乱码的状态
test_sstring = test_ele.xpath('./span/text()')

# 先编码再转码
test_sstring .encode('ISO-8859-1').decode('utf-8')

1.4 requests 的 session 携带cookie做全局会话交互

代码语言:javascript复制
session = requests.Session()

# 本次会话的所有 cookie 保存在 session 对象里面
# get()、post() 的使用方式与 requests 是一样的
session.get()...
session.post.()..

1.5多线程的使用

代码语言:javascript复制
import requests
from lxml import etree
from pprint import pprint
from multiprocessing.dummy import Pool

web_host = 'http://sc.chinaz.com/'
web_url = 'http://sc.chinaz.com/jianli/free.html'
web_headers = {
    'User-Agent': ' Mozilla/5.0 (Windows NT 10.0; …) Gecko/20100101 Firefox/75.0'
}

# 请求到免费简历页面
web_response = requests.get(web_url, web_headers)
web_response.encoding = 'utf8'
web_text = web_response.text
web_tree = etree.HTML(web_text)

# 每一个free 标签
free_tags = web_tree.xpath('//div[@id="container"]/div/a')

free_list = []

for free_jianli in free_tags:
    free_list.append({free_jianli.xpath('./img/@alt')[0]: free_jianli.xpath('./@href')[0]})

pprint(free_list)

"""
free_list = 
[
    {'家具招聘导购员简历表格': 'http://sc.chinaz.com/jianli/200503474310.htm'},
    {'求职简历临床医学封面': 'http://sc.chinaz.com/jianli/200503107801.htm'},
    {'药剂科中药房个人简历': 'http://sc.chinaz.com/jianli/200502326660.htm'},
    {'幼师表格简历模板免费下载': 'http://sc.chinaz.com/jianli/200502443741.htm'},
    ...
    ...
}
"""


# 每一个线程都执行该函数
def down_load_source(source_dict):
    name, source_url = [item for item in source_dict.items()][0]
    data = requests.get(source_url, web_headers).content
    # 这一步返回的每一个字典都将加入列表
    return {name: data}


# 将结果保存
def save_data(data_dict):
    name, bytes_data = [item for item in data_dict.items()][0]
    with open('jianli/{}.rar'.format(name), 'wb') as ff:
        ff.write(bytes_data)
        print(name   '下载完毕')


# 起 5 个进程
pool = Pool(5)

# 所有结果返回这个列表
data_list = pool.map(down_load_source, free_list)

# 下载数据
pool.map(save_data, data_list)

pool.close()
pool.join()

2.selenium的使用

代码语言:javascript复制
pip install seslnium

2.1谷歌浏览器无浏览器状态执行

代码语言:javascript复制
from selenium.webdriver.chrome.options import Options
from selenium import wendriver

chrome_options = Options()
chrome_options.add_argument('--headless')
chrome_options.add_argument('--disable-gpu')

#谷歌无头浏览器,脚本正常执行,没有浏览器显示
bro = webdriver.Chrome(chrome_options=chrome_options)

2.2谷歌各个版本对应驱动

2.3驱动的下载地址

代码语言:javascript复制
http://npm.taobao.org/mirrors/chromedriver/

2.4 PhantomJS 使用无头浏览器,不像谷歌浏览器需要设置Options

代码语言:javascript复制
bro = webdriver.PhantomJS(executable_path=r'C:UsersAdministratorDesktop爬虫 数据day04phantomjs-2.1.1-windowsbinphantomjs.exe')

2.5 PhantomJS 驱动下载地址

代码语言:javascript复制
https://phantomjs.org/

3.安装scrapy

3.1 pip3 install wheel

代码语言:javascript复制
#  pip3 install wheel

3.2 下载 twisted

代码语言:javascript复制
# 地址
# https://www.lfd.uci.edu/~gohlke/pythonlibs/#twisted

# cmd cd 到该下载包的目录下,执行安装

3.3 pip install pywin32

代码语言:javascript复制
# pip install pywin32#

3.4 pip install scrapy

代码语言:javascript复制
# pip install scrapy-

4.scrapy命令

4.1创建一个爬虫项目

代码语言:javascript复制
scrapy startproject xxx    (项目名称)

4.2创建一个爬虫文件

代码语言:javascript复制
scrapy genspider xxx   www.xxx.com (爬虫文件名,起始域名,可更换)

4.3执行一个爬虫文件

代码语言:javascript复制
scrapy crawl xxx  --nolog      # 在无日志的状态下执行,不加默认带显示日志

0 人点赞