目录
MangoDB
- 绑定服务
mangodb --bind_ip 0.0.0.0 --logpath D:\MangoDb\Log --logappend --dbpath D:\MangoDb\Data --port 27017 --service Name "MangoDb" --serviceDisplayName "MangoDb" --install
- 可视化:robomango
Redis
- redis desktop manager
爬虫常用库安装
selenium
- 驱动浏览器执行js渲染,自动化测试
- chromedriver驱动谷歌浏览器
- phantomjs
lxml
- xpath解析
beautifulsoup
- 网页解析
pyquery
- 类似jquery的解析库
pymysql
- 操作mysql
pymongo
- 操作mongodb
Redis
- 操作redis
Flask
- 设置代理服务器
Django
- 制作管理系统,维护分布式爬虫的信息
爬虫原理
- 爬虫步骤:发起请求,获取响应,解析内容,保存数据
- get请求的参数一般是在url中
- post请求的参数在form data中
- 响应分为:状态码、响应头、响应体
- 请求到的网页和浏览器不一致的原因:请求网页中包含js代码,操作后台接口获取数据,渲染网页
- 浏览器拿到network下的所有文件,组装渲染成elements(当前页面下的所有东西)
- 解决js渲染的问题:分析Ajax请求,Selenium/WebDriver模拟浏览器
- Ajax编程:通过操作XMLHTTPRequest对象,在不刷新页面的情况下请求特定URL,返回json数据
正则表达式
- re.match
- re.search
- re.findall
- re.sub
- re.compile
BeautifulSoup
解析库
- Python标准库——html.parser
- lxml HTML解析器——lxml
- lxml XML解析器——xml
- html5lib——html5lib
基本使用
from bs4 import BeautifulSoup
soup = BeautifulSoup(html, "lxml")
print(soup.prettify()) #格式化html
print(soup.title.string) #输出title标签
标签选择器
#输出第一个匹配标签
soup.title
soup.head
soup.p
#获取属性
soup.p["name"]
#获取标签里的内容
soup.p.string
#获取子节点列表
--soup.p.contents
--soup.p.children
#获取子孙结点列表
--soup.p.descendants
#获取父节点
soup.a.parent
#获取祖先结点
soup.a.parents
#获取兄弟结点
soup.a.next_siblings
soup.a.previous_siblings
标准选择器
find_all(name, attrs, recursive, text)
#根据标签名、属性、内容查找文档
find(name, attrs, recursive, text)
#返回第一个匹配元素
CSS选择器
#通过select选择
soup.select('.class_name .child_class_name')
soup.select('标签名')
soup.select('#id_name')
#获取属性
for ul in soup.select('ul')
print(ul['Id'])
#获取内容
for ul in soup.select('ul')
print(ul.get_text())
PyQuery
初始化
from pyquery import PyQuery as pq
-- doc = pq(html)
-- doc = pq(url='')
-- doc = pq(filename='w文件路径')
print(doc('li'))
DOM操作
#删除类
doc = pq(html)
li = doc('.item .active')
li.removeClass('active')
#增加类
li.addClass('active')
#增加属性
li.attr('name', 'link')
#增加CSS(style)
li.css('font-size', '14px')
#删除标签
li.find('p').remove()
Selenium
基本使用
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.wait import WebDriverWait
browser = webdriver.Chrome()
try:
browser.get('https://www.baidu.com')
input = browser.find_element_by_id('kw')
input.send_keys('Python')
input.send_keys(Keys.ENTER)
wait = WebDriverWait(browser, 10)
wait.until(EC.presence_of_element_located(By.ID, 'content_left'))
print(browser.current_url)
print(browser.get_cookies())
print(browser.page_source)
finally:
browser.close()
声明浏览器对象
browser = webdriver.Chrome()
browser = webdriver.PhantomJS()
访问页面
browser.get(url)
print(browser.page_source)
browser.close()
查找元素
find_element_by_name
find_element_by_id['q']
find_element_by_css_selector('#q')
find_element_by_xpath
find_element(By.ID, 'q')
find_element(By.CSS_SELECTOR, '#q')
元素交互操作
input.send_keys('IPhone')
time.sleep(1)
input.clear()
input.send_keys('IPad')
button = browser.find_element_by_class_name('btn-search')
button.click()
交互动作
#拖拽元素
from selenium.webdriver import ActionChains
browser.switch_to.frame('iframeResult')
source = browser.find_element_by_css_selector('#draggable')
target = browser.find_element_by_css_selector('#droppable')
actions = ActionChains(browser)
actions.drag_and_drop(source, target)
actions.perform()
执行JavaScript
browser.execute_script('alert("Success!")')
获取元素信息
logo = browser.find_element_by_id('zh')
print(logo.get_attribute('class'))
print(logo.text)
print(logo.id)
print(logo.tag_name)
Frame
browser.switch_to.frame('iFrameResult')
browser.switch_to.parent_frame()
等待
#等待加载Ajax等......
#隐式等待:为接下来的操作设定最大等待时间
browser.implicity_wait(10)
#显式等待:判断条件为真则执行,否则等待到最大时间
from selenium.webdriver.support.ui import WebDriveWait
from selenium.webdriver.support import expected_conditions as EC
wait = WebDriverWait(browser, 10)
input = wait.until(EC.presence_of_element_located(By.ID, 'q'))
button = wait.until(EC.element_to_be_clickable(By.CSS_SELECTOR, 'btn-search'))
前进后退
browser.back()
browser.forward()
Cookies
browser.get_cookies()
browser.add_cookie({"name":"Ming", "domain":"www.baidu.com"})
选项卡
browser.switch_to_window(browser.window_handlers[1])
scrapy分布式爬取
方法
- 一台主设备上维护爬取队列,多台从设备获取request进行爬取
- 利用scrapy_redis库爬取,在主设备上部署redis保存爬取队列
- 提供了共享爬取队列、request指纹去重、request优先级等功能的实现
- 通过git在从设备上同步scrapy代码
操作
- setttings的配置
#更改调度器
SCHEDULER = "scrapy_redis.scheduler.Scheduler"
#更改去重类
DUPEFILTER_CLASS = "scrapy_redis.dupefilter.RFPDupeFilter"
#启用Redispipeline
ITEM_PIPELINES = {
'scrapy_redis.pipelines.RedisPipeline': 300
}
#指定redis数据库连接信息
REDIS_URL = 'redis://user:pass@hostname:9001'
Schedule_Flush_On_Start
设为True后,从设备重启后会清空request及指纹队列,默认False,一般不用改Scheduler_Persist
设为True后,任务完成后不会清空request及指纹队列,默认False,一般不用改- 把
RedisPipeLine
注释掉后,主设备的Redis数据库就只保存request及指纹队列,不保存爬取结果(爬取结果存在从设备数据库中),推荐注释掉
pandas抓取表格
结构
<table class="..." id="...">
<thead>
<tr>
<th>...</th>
</tr>
</thead>
<tbody>
<tr>
<td>...</td>
</tr>
...
<tr>...</tr>
<tr>...</tr>
</tbody>
</table>
代码
import pandas as pd
import csv
df2 = pd.DataFrame()
for i in range(6):
url2 = 'http://vip.stock.finance.sina.com.cn/q/go.php/vComStockHold/kind/jjzc/index.phtml?p={page}'.format(page=i+1)
df2 = pd.concat([df2,pd.read_html(url2)[0]]) #[0]表示抓取当页第一个表格
print('第{page}页抓取完成'.format(page = i + 1))
df2.to_csv('./新浪财经数据.csv',encoding='utf-8',index=0)
反反爬
返回值解密处理
if response.status_code == 200:
re = response.content.decode('utf-8')
伪造UA
from fake_useragent import UserAgent
ua = UserAgent(verify_ssl=False)
headers = {"User-Agent": ua.random}
数据保存
保存到数据库
保存到表格
- 通过DataFrame保存
df3 = pd.concat([df3,df3_2]) #数据合并
df3 = df1.append(dict2, ignore_index=True) #附加数据
df3.to_csv('1.csv', encoding='utf-8',index=0)
- DictWriter写字典
with open('./1.csv', 'a', encoding='utf_8_sig', newline='') as fp: # 'a'为追加模式(添加),utf_8_sig格式导出csv不乱码
fieldnames = ['a', 'b', 'c', 'd', 'e','f','g','h','i']
writer = csv.DictWriter(fp,fieldnames)
writer.writerow(item)
标签:Python,爬虫,element,soup,print,--,find,browser
From: https://www.cnblogs.com/z5onk0/p/16755079.html