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] # 取到某一个属性值
# [0],主要不要混乱
free_tags = web_tree.xpath('//div[@id="container"]/div/a/@href')[0]
./ # xpath 表达式定位之后再定位
test_fa_ele = web_tree.xpath('//div[@id="xxx"]/div')
# 基于 test_fa_ele 之后再定位到下面的 a 标签下的 href 属性值
test_son_ele = test_ele.xpath('./a/@href')
/ 和 // # 获取标签下一段文本以 和 全部文本
# 仅仅获取 span 标签下的文本
test_son_ele = test_ele.xpath('./span/text()')
代码语言:javascript复制# 只要是在该 div 标签下的文本,全部获取,包含 div 下的子标签的文本也会获取过来
test_son_ele = test_ele.xpath('./span//text()')
| # xpath 解析接受多个 xpath 表达式
test_ele = web_tree.xpath('//div[@id="xxx"]/div' | '//div[@id="yyy"]/div')
解决乱码的万能处理方法
# 现在解析出来的部分文字是乱码的状态
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 # 在无日志的状态下执行,不加默认带显示日志