python爬虫-笔记-尚硅谷

Urllib

一、urllib的使用

#python自带的库
import urllib.request

if __name__ == '__main__':
    # 1.流程
    # (1)定义url
    url = 'http://www.baidu.com'
    # (2)摸底浏览器向服务器发送请求--响应
    response=urllib.request.urlopen(url)
    # (3)获取响应中的页面的源码--内容
    # read方法 返回二进制数据
    content=response.read().decode('utf-8')

    # 2.1个类型,6个方法
    # (1)类型:<class 'http.client.HTTPResponse'>
    print(type(response))
    # (2)read一个字节一个字节的读,返回5个字节
    print(response.read(5))
    # (3)读一行/读多行readlines
    print(response.readline())
    # (4)返回状态码:200--逻辑对
    print(response.getcode())
    # (5)返回url地址
    print(response.geturl())
    # (6)获取响应头信息
    print(response.getheaders())
    # 3.urllib_下载
    # 注意:python中参数可以写:①k=v值②v值
    # (1)url检索
    # ①html
    urllib.request.urlretrieve('http://www.baidu.com','baidu1.html')
    # ②图片
    urllib.request.urlretrieve('网址','xxx.jpg')
    # ③视频
    urllib.request.urlretrieve('网址','xxx.mp4')

二、请求对象的定制

import urllib.request
if __name__ == '__main__':
    url = 'https://www.baidu.com'

    # 1.UA(User Agent),用户代理:使服务器能识别客户的各种信息
    # (1)定制请求对象:解决反爬的第一种手段
    headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36 Edg/124.0.0.0'}
    # 因为urlopen方法不能存储字典 所有headers不能传递进去==>定制请求对象
    # response= urllib.request.urlopen(url,headers)
    request = urllib.request.Request(url=url,headers=headers)

    # (2)打印源码
    response = urllib.request.urlopen(request)
    content = response.read().decode('utf-8')
    print(content)

三、编解码

1.get请求方式

import urllib.parse
import urllib.request
if __name__ == '__main__':
    #需求 获取周杰伦的网页源码
    url = 'https://www.baidu.com/s?&wd=周杰伦'
    headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36 Edg/124.0.0.0'}
    request = urllib.request.Request(url=url,headers=headers)
    # 1.此时周杰伦三个字在ASCII表之外,所以需要变成unicode编码的格式==>我们需要依赖于urllib.parse
    # (1)quote:转化单个参数
    name=urllib.parse.quote("周杰伦")

    # (2)urlencode:转换多个参数(&连接)
    data={
        'wd':'周杰伦',
        'sex':'男',
        'location':'中国台湾省'
    }
    a=urllib.parse.urlencode(data)
    url="https://www.baidu.com/s?"
    new_data=urllib.parse.urlencode(data)
    url=url+new_data
    request = urllib.request.Request(url=url,headers=headers)
    response = urllib.request.urlopen(request)
    content=response.read().decode('utf-8')
    print(content)

2.post请求方式

import urllib.parse
import urllib.request
if __name__ == '__main__':

    url='https://fanyi.baidu.com/sug'

    headers={'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36 Edg/124.0.0.0'}
    data={'kw':'spider'}
    # post请求的参数 必须要进行编码
    data= urllib.parse.urlencode(data).encode('utf-8')
    # post请求的参数,是不会拼接在url的后面,而是需要放在请求对象定制的参数中
    request=urllib.request.Request(url=url,data=data,headers=headers)

    response=urllib.request.urlopen(request)
    content=response.read().decode('utf-8')
    print(content)
    # 此时content是str,转成json
    import json
    obj=json.loads(content)
    print(obj)
    # 总结:①post请求方式必须编码,编码之后必须
    #      ②参数是放在请求对象定制的方法中(date)

3.总结:postget区别?

①get请求方式的参数必须编码,参数是拼接到url后面,编码之后不需要调用encode方法

post 请求方式的参数必须编码,参数是放在请求对象定制的方法中,编码之后需要调用 encode 方法

四、ajax的get请求(ajax对应X-Requested-With:XMLHttpRequest)

import urllib.parse
import urllib.request
def create_request(page):
    url='https://movie.douban.com/j/chart/top_list?type=5&interval_id=100%3A90&action='
    data={
        'start':(page-1)*20,
        'limit':20
    }
    data = urllib.parse.urlencode(data)
    url=url+data
    print(url)
    headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36 Edg/124.0.0.0'}
    request = urllib.request.Request(url=url, headers=headers)
    return request

def get_content(request):
    response = urllib.request.urlopen(request)
    content = response.read().decode('utf-8')
    return content

def down_load(page,content):
    with open('douban_'+str(page)+'.json', 'w',encoding='utf-8') as f:
        f.write(content)

if __name__ == '__main__':
    start_page=int(input("请输入起始的页码"))
    end_page=int(input("请输入结束的页码"))
    for page in range(start_page,end_page+1):
        # 每一页都有定制的请求对象
        request=create_request(page)
        # 获取响应的数据
        content=get_content(request)
        # 下载
        down_load(page,content)

五、URLError\HTTPError

1.HTTPError类是URLError类的子类

2.导入的包:import urllib.error

3.(1)HTTPError:服务器响应问题,urllib.error.HTTPError

   (2)URLError:爬虫代码问题,urllib.error.URLError

六、cookie登录

# 适用的场景:数据采集的时候 需要绕过登陆 然后进入到某个页面
# 个人信息页面是utf-8  但是爬取却是报错了-编码错误  因为并没有进入到个人信息页面 而是跳转到了登陆页面
# 那么登陆页面不是utf-8  所以报错

# 什么情况下访问不成功?
# 因为请求头的信息不够  所以访问不成功

import urllib.request

url = 'https://weibo.cn/6451491586/info'

headers = {
    # 下面信息在weibo.cn中,冒号开头的没啥用
# ':authority': 'weibo.cn',
# ':method': 'GET',
# ':path': '/6451491586/info',
# ':scheme': 'https',
'accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9',
# 'accept-encoding': 'gzip, deflate, br',
'accept-language': 'zh-CN,zh;q=0.9',
'cache-control': 'max-age=0',
##### cookie中携带着你的登陆信息   如果有登陆之后的cookie  那么我们就可以携带着cookie进入到任何页面
'cookie': '_T_WM=24c44910ba98d188fced94ba0da5960e; SUBP=0033WrSXqPxfM725Ws9jqgMF55529P9D9WFxxfgNNUmXi4YiaYZKr_J_5NHD95QcSh-pSh.pSKncWs4DqcjiqgSXIgvVPcpD; SUB=_2A25MKKG_DeRhGeBK7lMV-S_JwzqIHXVv0s_3rDV6PUJbktCOLXL2kW1NR6e0UHkCGcyvxTYyKB2OV9aloJJ7mUNz; SSOLoginState=1630327279',
##### referer  判断当前路径是不是由上一个路径进来的    一般情况下 是做图片防盗链
'referer': 'https://weibo.cn/',
'sec-ch-ua': '"Chromium";v="92", " Not A;Brand";v="99", "Google Chrome";v="92"',
'sec-ch-ua-mobile': '?0',
'sec-fetch-dest': 'document',
'sec-fetch-mode': 'navigate',
'sec-fetch-site': 'same-origin',
'sec-fetch-user': '?1',
'upgrade-insecure-requests': '1',
'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.159 Safari/537.36',
}

# 请求对象的定制
request = urllib.request.Request(url=url,headers=headers)
# 模拟浏览器向服务器发送请求
response = urllib.request.urlopen(request)
# 获取响应的数据
content = response.read().decode('utf-8')

# 将数据保存到本地
with open('weibo.html','w',encoding='utf-8')as fp:
    fp.write(content)

七、Handler处理器

# 需求 使用handler来访问百度  获取网页源码
import urllib.request
url = 'http://www.baidu.com'
headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.159 Safari/537.36'
}
request = urllib.request.Request(url = url,headers = headers)

# handler   build_opener  open

# (1)获取hanlder对象
handler = urllib.request.HTTPHandler()

# (2)获取opener对象
opener = urllib.request.build_opener(handler)

# (3) 调用open方法
# response = urllib.request.urlopen(request)
response = opener.open(request)

content = response.read().decode('utf-8')
print(content)

八、代理服务器

import urllib.request

# 代理池
proxies_pool = [
    {'http':'118.24.219.151:16817'},
    {'http':'118.24.219.151:16817'},
]

import random

proxies = random.choice(proxies_pool)

url = 'http://www.baidu.com/s?wd=ip'

headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.159 Safari/537.36'
}

request = urllib.request.Request(url = url,headers=headers)


# handler   build_opener  open

# 准备    (1)获取hanlder对象
# proxy代理服务器
handler = urllib.request.ProxyHandler(proxies=proxies)

# 融入    (2)获取opener对象
opener = urllib.request.build_opener(handler)

# 请求    (3) 调用open方法
response = opener.open(request)

content = response.read().decode('utf-8')

with open('daili.html','w',encoding='utf-8')as fp:
    fp.write(content)

解析 

一、xpath:解析.xml

# 安装
1.扩展程序
2.拖拽xpath.zip到浏览器中
# 使用
1.ctrl + shift + x:打开
2.摁住shift + 鼠标:选中
# 1.导包
from lxml import etree

# 2.xpath解析
# (1)本地文件       extree.parse
# (2)服务器响应文件  extree.HTML()
tree=etree.parse('test1.html')

# 3.查找所需数据
# tree.xpath('xpath路径')
li_list = tree.xpath('//ul/li[@id="l1"]/@class')[0]

# 判断列表的长度
print(li_list)       # 地址
print(len(li_list))     # 个数
# 4.xpath查询
# ①路径查询
    //:查找所有 子孙 节点
    / :只找 子 节点
li_list = tree.xpath('//body/ul/li')

# ②谓词查询
    div[@id]
    div[@id="maincontent"]
# a.查找所有有id的属性的li标签
# text()获取标签中的内容
li_list = tree.xpath('//ul/li[@id]/text()')
# b.查找id为l1的li标签(注意引号的问题)
li_list = tree.xpath('//ul/li[@id="l1"]/text()')
# c.查找id有哪些
li_list = tree.xpath('//ul/li/@id')

# ③属性查询
    @class

# ④模糊查询
    div[contains(@id, "he")]
    div[starts‐with(@id, "he")]
# 包括有i的,不是只有i的
li_list=tree.xpath('//ul/li[contains(@id,"i")]')
# urllib.request.urlretrieve('图片地址','文件的名字').
urllib.request.urlretrieve(url=url,filename='./loveImg/' + name + '.jpg')

二、JsonPath:解析.json

# 安装
pip install jsonpath

# jsonpath的使用:
obj = json.load(open('json文件', 'r', encoding='utf‐8'))
result = jsonpath.jsonpath(obj, '筛选条件(链接最后的表格)')

# 导包
import jsonpath
import json

# 所有的作者
author_list=jsonpath.jsonpath(obj,'$.store..price')
print(author_list)

直接看最后一个表格

Selenium

一、Selenium:帮你反爬,模拟正常用户

# 1.下载浏览器驱动
# 2.下载包
pip install selenium
from selenium.webdriver.edge.service import Service
from selenium import webdriver

# 加载浏览器驱动
s = Service("msedgedriver.exe")

# 创建一个浏览器(初始化)
browser = webdriver.Edge(service=s)
# 最大化窗口
browser.maximize_window()
# 得到网址
browser.get("https://www.baidu.com")
# 获取源码
source=browser.page_source
print(source)

1.元素定位

# 导入By类,用于指定元素定位方式
from selenium.webdriver.common.by import By

# 常用三种,其他搜
browser.find_element(By.ID,value=" ")    #id
browser.find_element(By.NAME,value=" ")    #name
browser.find_element(By.XPATH,value=" ")	# xpath

2.自动化交互

# 打印网页标题
driver.title
# 关闭浏览器
driver.quit()

# 搭配定位元素,输入文本框
# 找到文本框位置
input_box = driver.find_element(By.ID, '')
# 输入信息
input_box.send_keys('Hello, Selenium!')
# 找到提交按钮位置
button = driver.find_element(By.ID, ' ')
# 提交按钮
button.click()

二、handless

# 1.为了加载浏览器驱动
from selenium.webdriver.edge.service import Service
from selenium import webdriver
# 2.为了headless,无头模式:后台运行服务器
from selenium.webdriver.edge.options import Options


# 1.加载浏览器驱动
s = Service("msedgedriver.exe")
# 2.headless模式
edge_options = Options()
edge_options.add_argument('--headless')
# 创建一个浏览器
driver = webdriver.Edge(options=edge_options,service=s)

# 得到网址
driver.get("https://www.baidu.com")
driver.page_source
print(driver.page_source)

requests

一、基本使用

pip install requests

import requests
url = 'http://www.baidu.com/s?'
headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36 Edg/124.0.0.0'
}
data = {
    'wd':'北京'
}
# get请求
response = requests.get(url,params=data,headers=headers)
# post请求
r = requests.post(url = post_url,headers=headers,data=data)
# 代理
proxy={'http':'ip地址:端口号'}
response = requests.get(url=url,params=data,headers=headers,proxies=proxy)

1.定制参数

①参数使用 params 传递
②参数无需 urlencode 编码
③不需要请求对象的定制
④请求资源路径中?可加可不加
2.response的属性以及类型
类型 : models.Response
r.text : 获取源码
r.encoding :访问或定制编码方式
r.url :获取请求的 url
r.content :响应的字节类型
r.status_code :响应的状态码
r.headers :响应的头信息
3.cookie
## 难点
# (1) 隐藏域
# (2) 验证码

# 通过找登陆接口我们发现 登陆的时候需要的参数很多
# _VIEWSTATE: /m1O5dxmOo7f1qlmvtnyNyhhaUrWNVTs3TMKIsm1lvpIgs0WWWUCQHl5iMrvLlwnsqLUN6Wh1aNpitc4WnOt0So3k6UYdFyqCPI6jWSvC8yBA1Q39I7uuR4NjGo=
# __VIEWSTATEGENERATOR: C93BE1AE
# from: http://so.gushiwen.cn/user/collect.aspx
# email: 595165358@qq.com
# pwd: action
# code: PId7
# denglu: 登录

# 1.我们观察到_VIEWSTATE   __VIEWSTATEGENERATOR  code是一个可以变化的量

# 难点:(1)_VIEWSTATE   __VIEWSTATEGENERATOR  一般情况看不到的数据 都是在页面的源码中
#     我们观察到这两个数据在页面的源码中 所以我们需要获取页面的源码 然后进行解析就可以获取了
#     (2)验证码

# 获取_VIEWSTATE
viewstate = soup.select('#__VIEWSTATE')[0].attrs.get('value')

# 获取__VIEWSTATEGENERATOR
viewstategenerator = soup.select('#__VIEWSTATEGENERATOR')[0].attrs.get('value')


# 获取验证码图片
code = soup.select('#imgCode')[0].attrs.get('src')
code_url = 'https://so.gushiwen.cn' + code

# 有坑:获取验证码图片后,会刷新验证码,在提交请求后,验证码不正确
# import urllib.request
# urllib.request.urlretrieve(url=code_url,filename='code.jpg')
# requests里面有一个方法 session()  通过session的返回值 就能使用请求变成一个对象
session = requests.session()

# 验证码的url的内容
response_code = session.get(code_url)
# 注意此时要使用二进制数据  因为我们要使用的是图片的下载
content_code = response_code.content
# wb的模式就是将二进制数据写入到文件
with open('code.jpg','wb')as fp:
    fp.write(content_code)

scrapy

一、scrapy

# 1.创建scrapy项目
scrapy startproject 项目名称
# 项目组成:
          spiders 
              __init__.py
              自定义的爬虫文件.py  ‐‐‐》由我们自己创建,是实现爬虫核心功能的文件
          __init__.py                  
          items.py             ‐‐‐》定义数据结构的地方,是一个继承自scrapy.Item的类
          middlewares.py       ‐‐‐》中间件   代理
          pipelines.py         ‐‐‐》管道文件,里面只有一个类,用于处理下载数据的后续处理
                                        默认是300优先级,值越小优先级越高(1‐1000)
          settings.py          ‐‐‐》配置文件  比如:是否遵守robots协议,User‐Agent定义等
# 2.创建爬虫文件:要在spiders文件中去创建爬虫文件
cd 项目名/项目名/spiders
# scrapy genspider 爬虫文件的名字 要爬取网页
scrapy genspider baidu http://www.baidu.com
      
      # 如果请求接口是html为结尾的,那么不需要加/的
      allowed_domains   ‐‐》 爬虫允许的域名,在爬取时候,如果不是此域名之下的url,会被过滤掉
      start_urls        ‐‐》 声明了爬虫的起始地址,可以写多个url,一般是一个
          parse(self, response) ‐‐》解析数据的回调函数
              response.text         ‐‐》源码-字符串
              response.body         ‐‐》二进制文件
              response.xpath()‐》xpath方法的返回值类型是selector列表
              extract()             ‐‐》提取的是selector对象的是data
              extract_first()       ‐‐》提取的是selector列表中的第一个数据
# 3.运行爬虫文件
scrapy crawl 爬虫名称

 scrapy工作原理 (重点)

二、scrapy shell

# 进入到scrapy shell的终端  直接在window的终端中输入scrapy shell 域名
# 如果想看到一些高亮 或者 自动补全  那么可以安装ipython  # pip install ipython

scrapy shell www.baidu.com
# 之后,进入ipython模式

三、yield

1. 函数内部: 带有 yield 的函数不再是一个普通函数,而是一个生成器 generator ,可用于迭代
2. 生成器是实现了迭代器协议的一种特殊迭代器。生成器通过 yield关键字在函数中 暂停执行(yield类似return,但是实现卡住程序和执行当前位置后一行),并在每次迭代时恢复执行,直到遇到下一个yield语句或者函数结束
# items.py文件下
# 通俗的说就是你要下载的数据都有什么
    # 图片
    src = scrapy.Field()
    # 名字
    name = scrapy.Field()
    # 价格
    price = scrapy.Field()
# dangdang.py文件
import scrapy
from scrapy_dangdang_001.items import ScrapyDangdang001Item

class DangdangSpider(scrapy.Spider):
    name = "dangdang"
    allowed_domains = ["category.dangdang.com"]
    start_urls = ["https://category.dangdang.com/cp01.54.26.00.00.00.html"]

    base_url = "https://category.dangdang.com/pg1"
    page=1

    def parse(self, response):
        # pipelines 下载数据
        # items     定义数据结构的
        # src = //ul[@id="component_59"]/li//img/@src
        # alt = //ul[@id="component_59"]/li//img/@alt
        # price = //ul[@id="component_59"]/li//p[@class="price"]/span[1]/text()
        # 所有的seletor(选择器)的对象 都可以再次调用xpath方法
        li_list=response.xpath('//ul[@id="component_59"]/li')
        for li in li_list:
            # 图片会有懒加载的可能:懒加载就是你页面没滑到图片那里,他是不会加载的,但是那时候的图片地址是错误的
            # @data-original解决懒加载
            # 但是注意第一张照片比较特殊,可能本来就是加载好的
            src = li.xpath('.//img/@data-original').extract_first()
            if src:
                src=src
            else:
                src=li.xpath('.//img/@src').extract_first()
            name=li.xpath('.//img/@alt').extract_first()
            price=li.xpath('.//p[@class="price"]/span[1]/text()').extract_first()

            book=ScrapyDangdang001Item(src=src,name=name,price=price)
            # 获取一个book就将book交给pipelines
            yield book

        if self.page<100:
            self.page+=1
            url=self.base_url+str(self.page)+'-cp01.54.26.00.00.00.html'

            # 怎么调用parse方法呢
            # scrapy.Request 就是 scrapy的get请求
            # url是请求地址,callback是要执行的函数
            yield scrapy.Request(url=url, callback=self.parse)
# pipelines.py文件
# 1.如果想使用管道的话,那么就必须在settings中开启管道 # ITEM_PIPELINES
# ITEM_PIPELINES的V值是优先级,越小优先级越高
class ScrapyDangdang001Pipeline:
    # 2.open_spider和close_spider这两个函数是内置的,代表爬虫文件开始之前执行(1次)/结束之后(1次)
    def open_spider(self, spider):
        self.f=open('book.json','w',encoding='utf-8')

    # 1.item就是yield的book对象
    def process_item(self, item, spider):
        # 1.以下模式不推荐,因为io操作频繁
        # # (1) write方法必须要写一个字符串,而不能是其他的对象==》需要强转
        # # (2) w 会覆盖==》所以选择a
        #
        # with open('book.json', 'a',encoding='utf-8')as f:
        #     f.write(str(item))
        self.f.write(str(item))
        return item


    def close_spider(self, spider):
        self.f.close()

import urllib.request
# 3.多条管道同时开启
# (1) 定义管道类
# (2) 在settings中开启管道
# 说明:上面那条管道是为了下载json数据,下面这条管道是为了下载图片数据。当yield数据过来时,两条管道都会运行
class Dangdang001Pipeline:
    def process_item(self, item, spider):

        url = 'http:'+item.get("src")
        filename = './books/'+item.get("name")+'.jpg'

        urllib.request.urlretrieve(url=url, filename=filename)

        return item
# settings.py文件
ITEM_PIPELINES = {
   "scrapy_dangdang_001.pipelines.ScrapyDangdang001Pipeline": 300,
   "scrapy_dangdang_001.pipelines.Dangdang001Pipeline" : 301
}

四、CrawlSpider:scrapy.spiders的派生类

如果有需要跟进链接的需求,就是爬取了网页之后,需要提取链接再次爬取,使用 CrawlSpider
1.创建项目:scrapy startproject dushuproject
2.跳转到spiders路径 cd\dushuproject\dushuproject\spiders
3.创建爬虫类:scrapy genspider ‐t crawl read www.dushu.com

4.提取链接
链接提取器,在这里就可以写规则提取指定链接
scrapy.linkextractors.LinkExtractor(
    # (1)正则表达式 提取符合正则的链接
    allow = (), 
    # (2)xpath,提取符合xpath规则的链接
    restrict_xpaths = ())
    
    # (1)正则用法:links1 = LinkExtractor(allow=r'list_23_\d+\.html')
    # (2)xpath用法:links2 = LinkExtractor(restrict_xpaths=r'//div[@class="x"]')
 
5.提取连接
link.extract_links(response)

6.注意事项
【注1】callback只能写函数名字符串, callback='parse_item'
【注2】在基本的spider中,如果重新发送请求,那里的callback写的是 callback=self.parse_item 【注‐
‐稍后看】follow=true 是否跟进 就是按照提取连接规则进行提取
运行原理:

数据入库

(1)settings配置参数:
    DB_HOST = '192.168.231.128'
    DB_PORT = 3306
    DB_USER = 'root'
    DB_PASSWORD = '1234'
    DB_NAME = 'test'
    DB_CHARSET = 'utf8'
(2)管道配置
    # 固定的
    from scrapy.utils.project import get_project_settings
    import pymysql
    class MysqlPipeline(object):
    #__init__方法和open_spider的作用是一样的
    #init是获取settings中的连接参数
        def __init__(self):
            settings = get_project_settings()
            self.host = settings['DB_HOST']
            self.port = settings['DB_PORT']
            self.user = settings['DB_USER']
            self.pwd = settings['DB_PWD']
            self.name = settings['DB_NAME']
            self.charset = settings['DB_CHARSET']
            self.connect()
    # 连接数据库并且获取cursor对象
        def connect(self):
            self.conn = pymysql.connect(host=self.host,
                                        port=self.port,
                                        user=self.user,
                                        password=self.pwd,
                                        db=self.name,
                                        charset=self.charset)
            self.cursor = self.conn.cursor()
        def process_item(self, item, spider):
            sql = 'insert into book(image_url, book_name, author, info) values("%s",
              "%s", "%s", "%s")' % (item['image_url'], item['book_name'], item['author'],                                                 
              item['info'])
            sql = 'insert into book(image_url,book_name,author,info) values
              ("{}","{}","{}","{}")'.format(item['image_url'], item['book_name'], 
              item['author'],item['info'])
            # 执行sql语句
            self.cursor.execute(sql)
            self.conn.commit()
            return item
        def close_spider(self, spider):
            self.conn.close()
            self.cursor.close()

五、日志信息和日志等级

(1)日志级别:
    CRITICAL:严重错误
    ERROR: 一般错误
    WARNING: 警告
    INFO: 一般信息
    DEBUG: 调试信息(默认)
    
(2)settings.py文件设置:
    LOG_FILE : 将屏幕显示的信息全部记录到文件中。文件后缀一定是.log
    LOG_LEVEL : 设置日志显示的等级

六、scrapy的post请求

(1)重写start_requests方法:
    def start_requests(self)
(2) start_requests的返回值:
    scrapy.FormRequest(url=url, headers=headers, callback=self.parse_item, formdata=data)
        url: 要发送的post地址
        headers:可以定制头信息
        callback: 回调函数
        formdata: post所携带的数据,这是一个字典

七、代理

(1)到settings.py中,打开一个选项
    DOWNLOADER_MIDDLEWARES = {
        'postproject.middlewares.Proxy': 543,
    }
(2)到middlewares.py中写代码
    def process_request(self, request, spider):
        request.meta['proxy'] = 'https://113.68.202.10:9999'
        return None

  • 16
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值