首页 > 编程语言 >Python爬虫

Python爬虫

时间:2022-10-05 09:46:45浏览次数:135  
标签:Python 爬虫 element soup print -- find browser

目录

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

相关文章

  • Python编程经验
    目录代码结构工作目录全局变量调试信息异常处理尝试次数化简结构日志哈希和ID函数第三方库exchangelib字符串处理replacestripsplitjoin格式化列表处理打包函数代码结构......
  • python爬虫使用session保持登录状态
    今天有个客户需求,从网站上下载会员试题,需要在登录状态下载,然后将网页中展示的试题保存在word中。网站上展示的所有试题要保存在一个word文档中,但是每一个试题结束下一个试......
  • Python文件处理
    Excel打开csv,去重,保存到exceldf=pd.read_csv("newhouse.csv",names=['name','xzqy','wylx',······,'state'])df=df.drop_duplicates()df.to_excel("newhouse......
  • Python数据处理
    PandasSeries一列带索引的数据s=pd.Series(np.random.randn(5),name='Helloworld')DataFrame二维数据,多组Series的集合df=pd.read_excel('GDP.xlsx')重......
  • Python可视化
    地图可视化pyecharts绘制各省市GDPfrompyecharts.globalsimportThemeType#引入主题Map(init_opts=opts.InitOpts(width="1000px",height="600px",theme=ThemeTyp......
  • python5-eg
    1实例012programmer_1='程序员甲:搞IT太辛苦了,我想换行......怎么办?'3programmer_2='程序员乙:敲一下回车键'4print(programmer_1+'\n'+programmer_2)实......
  • Python 中四舍五入的方法,你真的会吗
    Python的四舍五入,还真有点小麻烦。1、使用round大多数情况下,我们会使用round来保留小数,但这并不符合我们在数学知识里的规则。round(number[,ndigits])round()......
  • exchange邮件爬虫
    #!/usr/bin/python3#coding=utf8from__future__importprint_functionimportshutilfromexchangelibimportCredentials,Account,Configuration,DELEGATE,Fi......
  • 【笨方法学python】ex18 - 命名、变量、代码、函数
    代码如下:点击查看代码#-*-coding:utf-8--*-#命名、变量、代码、函数#thisoneislikeyourscriptswithargvdefprint_two(*args): arg1,arg2=args pri......
  • python装饰器进阶指南
    前言最近一有时间就在整理自己常用的代码片段,并做成了私人pip包,正好整理到了装饰器的部分,所以就想着写篇文章来总结一下。写这篇文章的目的是为了让大家对装饰器有一个更......