Scrapy框架
scrapy startproject name
items 爬取目标
middlewares 中间件
pipelines 爬后处理
settings 总体设置
items ->spiders (middlewares)->pipelines all settings
查看设置信息:scrapy settings --get BOT_NAME
交互式:scrapy shell 网址
scrapy bench 电脑爬取网址速度测试 4740
scrapy genspider -l 可用模板信息
basic
crawl
csvfeed
xmlfeed
scrapy genspider -t basic name 域名 创建爬虫文件
scrapy check name 测试爬虫是否合规 不包含后缀
scrapy crawl name (--nolog) 省略日志信息 运行爬虫文件
scrapy list 查看那些可用的爬虫文件
scrapy parse https://www.baidu.com/ 获取网址
Xpath表达式
/ 逐层提取
text() 提取标签下面的文本
/html/head/title/text()
//标签名 提取所有的标签
//标签名[@属性=‘属性值’] []约束 提取属性名为xx的标签
@属性名 代表取某个属性
//div[@class='tools']
数据去重
布隆
模拟登录
密码输错,返回的信息不多,但post地址一样
Form Data
lxml
网页源码转化为树的形式
PhantomJS
饭汤JS 可获取异步数据
import time
from selenium import webdriver
browser = webdriver.PhantomJS()
browser.get("http://www.baidu.com")
a=browser.get_screenshot_as_file("F:/PhantomJS/test.jpg") #截图当前网页
browser.find_element_by_xpath('//*[@id="kw"]').clear() #模拟人点击
browser.find_element_by_xpath('//*[@id="kw"]').send_keys("爬虫")
browser.find_element_by_xpath('//*[@id="su"]').click()
time.sleep(5) #延时不够,信息加载不完全
a=browser.get_screenshot_as_file("F:/PhantomJS/test2.jpg")
data=browser.page_source #浏览器的数据
browser.quit() #关闭浏览器
print(len(data))
import re
title=re.compile("<title>(.*?)</title>").findall(data)
print(title)
腾讯动漫
from selenium import webdriver
import time
from selenium.webdriver.common.desired_capabilities import DesiredCapabilities
# 伪装成浏览器
import re
import urllib.request
# 设为新的浏览器的类型
dcap = dict(DesiredCapabilities.PHANTOMJS)
dcap["phantomjs.page.settings.userAgent"] = ("Mozilla/4.0 (compatible; MSIE 5.5; windows NT)")
browser = webdriver.PhantomJS(desired_capabilities=dcap)
url="http://ac.qq.com/ComicView/index/id/539443/cid/1"
browser.get(url) # 获取浏览器地址
a = browser.get_screenshot_as_file("F:/PhantomJS/test.jpg") # 截图
for i in range(10): # 滑动浏览器
# browser.execute_script('window.scrollTo(0,document.body.scrollHeight)')
js = 'window.scrollTo(' + str(i * 1280) + ',' + str((i + 1) * 1280) + ')' # 1280为分辨率
browser.execute_script(js)
time.sleep(5)
print(browser.current_url) # 查看当前url
data = browser.page_source # 漫画数据
fh = open("F:/PhantomJS/dongman.html", "w", encoding="utf-8")
fh.write(data) # 写入漫画数据
fh.close()
browser.quit()
pat = '<img src="(http:..ac.tc.qq.com.store_file_download.buid=.*?name=.*?).jpg"'
allid = re.compile(pat).findall(data)
for i in range(0, len(allid)):
thisurl = allid[i]
thisurl2 = thisurl.replace("amp;", "") + ".jpg"
print(thisurl2)
localpath = "F:/PhantomJS/dongman/" + str(i) + ".jpg"
urllib.request.urlretrieve(thisurl2, filename=localpath)
分布式爬虫
应用多台机器同时实现爬虫任务 区别于单机爬虫的一种架构
多台机器之间的通信
爬取内容的存储:
1 存储在中心节点中
2 存储在各个节点中
任务分配 (redis)
数据存储 (Mysql)
Docker
轻量级容器级虚拟化技术
轻、快
systemctl start docker #开启docker
docker search ubuntu #查找
docker pull ubuntu #下载
docker images #查看可用镜像
docker ps -a #查看容器
docker run -tid idj-4 #创建容器 -ti 交互 -d 后台
docker run -tid --name name idj-4 #创建指定名字的容器
docker attach idr-4 #进入容器
exit #退出容器 容器停止
ctrl+q+p #退出容器 容器不停止
docker start idr-4 #开启容器
docker stop idr-4 #停止容器
docker commit idr-4 name:version #打包容器为镜像
docker run -tid --name h1 idj-4 #创建容器
docker run -tid --name h2 --link h1 idj-4 #创建连接h1的容器
查看网络情况
cat /etc/hosts
ping h1-ip
外界导入
docker load --input name.tar
导出
docker save -o /mytest.tar idj-4
Redis
数据库 速度快 作为共享中心
安装与启动redis
apt update
apt -y install redis-server #下载
/etc/init.d/redis-server restart #启动redis-server
redis-cli #启动redis客户端 exit退出
redis-cli -h 127.0.0.1 -p 6379 # -h 连接的主机 -p 指定端口 默认6379
使用基础
set zhang 123456
get zhang
get nokonw #(nil)
strlen zhang #(integer) 6 #对应值的长度
mset a 199 b 456 c hello #批量设置键值对
mget a b c #批量取出键值对
哈希存储法:键-域-值 key-field-value
hset title name hello
hget title name
hset title sex boy
hget title sex
hmset title name abc id 110 sex boy #批量设置
hgetall title #取出所有 奇域偶值
hset url 123.com 1
hget url 123.com 查看网址是否爬取
分布式爬虫构建
docker run -tid --name center
docker run -tid --name c1 --link center idj-4
开启mysql服务器
/etc/init.d/mysql restart
vim /etc/mysql/my.cnf
注释掉
root用户只支持本地连接
所以要新创建个用户
mysql -h 127.0.0.1 -u root -p1234
create user "xiaocai"@"%" identified by "1234"; # %支持任意的主机连接
grant create,select,updata,delete,insert on \*.\* to xiaocai; #给权
redis
启动redis
/etc/init.d/redis-server restart
redis-cli -h 127.0.0.8 #refused
修改配置文件
vim /etc/redis/redis.conf
修改配置文件后要重启,容器重启
redis-cli -h 127.0.0.8 #sucess