爬虫笔记.

第一、二周

爬虫概念:按照一定规则,自动请求万维网,并获取网页内容
爬虫法律规范:robots君子协议
爬虫限制:非法不允许(密码  明令禁止的)
服务器会做什么:反爬(检查你的信息(修改头部信息);
                           速度(降低速度);半永久封号(代理ip);验证码)
爬虫的分类:通用爬虫和聚焦爬虫
爬虫为什么选择python语言
爬虫的原理:模拟的正常网站的使用


200  ;404  403  500

浏览器浏览网页的过程:
浏览器通过DNS域名服务器查找对应的ip地址
向ip地址对应的web服务器发送请求
web服务器响应请求,发回html页面
浏览器解析html内容,并显示出来

统一资源定位符url:http://127.0.0.1:8080/subject/python/project.shtml
                               协议头 服务器地址和端口         文件路径
http和https的区别:SSL
http默认端口80 https默认端口443


ip地址(http://180.97.33.107)—为每一台计算机提供一个编号,非常不容易记忆和理解
所以发明了域名(http://www.baidu.com)代替ip地址

域名和ip地址之间的对应关系表—DNS服务器,完成ip地址和域名之间的映射

域名     ip地址

浏览器显示完整网页的过程:
在浏览器地址栏中输入http://www.baidu.com,
浏览器会发送一个Request请求去获取http://www.baidu.com的HTML页面
服务器会把包含该页面的response对象返回给浏览器
浏览器分析页面中的内容发现其中引用了很多文件,包括image js文件等,所以浏览器会再次发送Request去获取这些图片 js文件、
当所有的文件下载完成,浏览器根据html的语法结构,将网页完整的显示出来

第三周

1、爬虫分为几步
(1)拼接一下url地址
word=input('请输入要搜索的关键字:')
params=parse.urlencode({'wd':wored})#wd=%%%%%%
url='http://www.baidu.com/s?'.format(params)
header={'User-Agent':'mozi........'}

(2)发送请求获取响应
一、包装请求    二、发送请求   三、获取响应
req=request.Request(url=url,headers=header)
res=request.urlopen(req)
html=res.read().decode('')

(3)保存到本地
一、起名字 filename=word+'.html'
二、执行保存操作
with open(filename,'w') as f:
        f.write(html)


1、用户输入—爬取谁的吧
2、转码(urlencode)
3、拼接头部  拼接url地址
4、发送请求 获取响应
5、让用户选择,他想爬取多少页到多少页 就可以爬取(用户输入)
6、找规律,页数page和url地址之间的规律pn=(page-1)*50
7、让page进入for循环
8、结构:类形式(init函数:放一些初始化的函数;get_html发送请求获取响应;
                             parse_html解析页面提取想要的标题;save_html保存用的,run函数来控制)
                程序入口,main
class BaiduTiebaspiader:
    def __init__(self):#放一些初始化的函数
        pass
    def get_html(self):#发送请求获取响应
        pass
    def parse_html(self):#解析页面提取想要的标题
        pass
    def save_html(self):#保存用的
        pass
    def run(self):#控制
        pass
if __name__=='__main__':#是否是系统变量,是模块的标识符
    spider=BaiduTiebaspiader()
    spider.run()

#任意选取符合规定的网站,要求用户输入+爬取(需要涉及转码 拼接url地址 拼接头部)

https://www.baidu.com/s?wd=%E5%88%98%E4%BA%A6%E8%8F%B2

#beautifulsoup和xpath很多一样,设计的目的解析xml  html
#字符串——正则    html xml——xpath beautifulsoup    json——jsopath
#直接拿过来就可以用

#一、完成buautifulsoup4安装
# 两种方法 安装buautifulsoup4:
# 命令方式  安装: pip3 install beautifulsoup4
# pycharm环境形式 安装:file  settings   project +   beautifulsoup4  安装  ok

#二、导入buautifulsoup类
# from bs4 import BeautifulSoup

#三、传入初始化参数
# soup=BeautifulSoup('html_doc','lxml')
# html_doc被解析的对象  lxml解析器进行解析

#xpath             lxml库  解析器
#beautifulsoup     lxml库  解析器;python标准库;html5lib解析器


#四、实例
# from bs4 import BeautifulSoup
# markup='<a href="http://example.com" rel="external nonfollow" rel="external nonfollow" rel="external nonfollow">l ike to <i>example.com</i></a>'
# soup=BeautifulSoup(markup,'lxml')
# # print(soup)
# # print(soup.prettify())
# print(soup.find_all('i'))
# print(soup.find_all('i','a'))
# print(soup.find_all(['i','a']))
# print(soup.find_all(rel="external nonfollow"))


#json模块——键值对
#jsonpath寻址——多层嵌套字典 直接进行数据提取
# data={'key1':{'key2':{'key3':{'key4':{'key5':{'key6':'python'}}}}}}
# print(data['key1']['key2']['key3']['key4']['key5']['key6'])
#
# import jsonpath
# print(jsonpath.jsonpath(data,'$.key1.key2.key3.key4.key5.key6'))
# print(jsonpath.jsonpath(data,'$..key6'))

#json模块去字符串 加字符串
# import json
# json.dump()
# json.loads()
# 序列化:python转成字符串  (操作完 执行保存操作前 序列化)  json.dump()   json.dumps()
# 反序列化:把字符串转成python(寻址之前 对字符串 进行去字符串的操作) json.loads()   json.load()

#json.loads的用法
# import json
# str_list='[1,2,3,4]'
# str_dict='{"city":"北京","name":"小明"}'
# print(type(str_list))
# print(type(str_dict))
# print(type(json.loads(str_list)))
# print(type(json.loads(str_dict)))


#json.dump的用法
# import json
# app_list=[
#     {"name":"腾讯qq","link":"http://www.qq.com"},
#     {"name":"新浪微博","link":"http://www.xinlang.com"},
#     {"name":"吃鸡","link":"http://www.***.com"}
# ]
# with open('app.json','w',encoding='utf-8') as f:
#     json.dump(app_list,f,ensure_ascii=False)

第四周

第五周

0、介绍课本目录,了解前四周基础知识重要性
      明确熟练掌握的知识:爬虫  解析 框架
1、明确任务汇率
      安装flask框架   创建汇率文件   创建服务器网站
      回顾前4周爬虫知识   
      书写客户端爬虫代码

2、Get和Post方法
      Get 和Post方法在客户端程序写法的区别(重要)
      明确GET POST方法的区别:url地址的拼接,安全性;
      Get和Post方法在服务器端获取数据的方式完全一致;
      Get 和Post方法在路由选择中,默认选择的为get  指定post方式如何指定,两种均可如何指定;
      利用Get 和Post方法实现多个参数的设置利用&进行拼接。
      
3、正则表达式(课本p14页)

11.6号

#beautifulsoup和xpath很多一样,设计的目的解析xml  html
#字符串——正则    html xml——xpath beautifulsoup    json——jsopath
#直接拿过来就可以用

#一、完成buautifulsoup4安装
# 两种方法 安装buautifulsoup4:
# 命令方式  安装: pip3 install beautifulsoup4
# pycharm环境形式 安装:file  settings   project +   beautifulsoup4  安装  ok

#二、导入buautifulsoup类
# from bs4 import BeautifulSoup

#三、传入初始化参数
# soup=BeautifulSoup('html_doc','lxml')
# html_doc被解析的对象  lxml解析器进行解析

#xpath             lxml库  解析器
#beautifulsoup     lxml库  解析器;python标准库;html5lib解析器


#四、实例
# from bs4 import BeautifulSoup
# markup='<a href="http://example.com" rel="external nonfollow" rel="external nonfollow" rel="external nonfollow">l ike to <i>example.com</i></a>'
# soup=BeautifulSoup(markup,'lxml')
# # print(soup)
# # print(soup.prettify())
# print(soup.find_all('i'))
# print(soup.find_all('i','a'))
# print(soup.find_all(['i','a']))
# print(soup.find_all(rel="external nonfollow"))


#json模块——键值对
#jsonpath寻址——多层嵌套字典 直接进行数据提取
# data={'key1':{'key2':{'key3':{'key4':{'key5':{'key6':'python'}}}}}}
# print(data['key1']['key2']['key3']['key4']['key5']['key6'])
#
# import jsonpath
# print(jsonpath.jsonpath(data,'$.key1.key2.key3.key4.key5.key6'))
# print(jsonpath.jsonpath(data,'$..key6'))

#json模块去字符串 加字符串
# import json
# json.dump()
# json.loads()
# 序列化:python转成字符串  (操作完 执行保存操作前 序列化)  json.dump()   json.dumps()
# 反序列化:把字符串转成python(寻址之前 对字符串 进行去字符串的操作) json.loads()   json.load()

#json.loads的用法
# import json
# str_list='[1,2,3,4]'
# str_dict='{"city":"北京","name":"小明"}'
# print(type(str_list))
# print(type(str_dict))
# print(type(json.loads(str_list)))
# print(type(json.loads(str_dict)))


#json.dump的用法
# import json
# app_list=[
#     {"name":"腾讯qq","link":"http://www.qq.com"},
#     {"name":"新浪微博","link":"http://www.xinlang.com"},
#     {"name":"吃鸡","link":"http://www.***.com"}
# ]
# with open('app.json','w',encoding='utf-8') as f:
#     json.dump(app_list,f,ensure_ascii=False)

11.13

爬虫

  1. 最基础的爬虫

Urllib库   .request()模块   .urlopen()

Import urllib.request

Res=Urllib.request.urlopen(url地址)

Res.read().decode()

2. 强化版

Urllib库   .request()模块  .parse()模块

.Request()    .urlopen()

.urlencode()  .parse()

Import urllib.request

Name=Input(“提示用户输入关键词”)

kw=urllib.parse.urlencode(Name)/parse(Name)

Url=’www.baidu.com...’+kw

New_url=Urllib.request.Request(url=url,headers=headers)

res=Urllib.request.urlopen(new_url)

res.read().decode()

3.最终强化

百度贴吧(当前页的爬取:用户的输入 头部信息的拼接  爬取)

Init   get_data()   parse_data()   save_data()    run()


     

import urllib.request
from urllib import request,parse
from lxml import etree
class Tieba(object):
    def __init__(self, name):
        self.url = 'https://tieba.baidu.com/f?kw=%E7%94%B5%E5%BD%B1%E7%A5%A8%E6%88%BF'
        self.headers = {'user-agent': 'Mozilla/4.0 (compatible; MSIE 5.01; Windows NT 5.0)'}

    def get_data(self,url):
        req=urllib.request.Request(url=url,headers=self.headers)
        res=urllib.request.urlopen(req)
        response=res.read().decode()
        return response

    def parse_data(self,data):
       pass

    def save_data(self,data_list):
        for data in data_list:
            print(data)
    def run(self):
      pass
if __name__=='__main__':
    tieba=Tieba('')
    tieba.run()

对爬虫爬取的东西进行解析

针对不同的网页数据结构有不同的数据解析办法

  1. 正则表达式——字符串解析(“hsdfhasijchniasfjc”)

Import  re  

Re.find(“chn”)

2.xpath——HTML XML(“<html><body><a><b><c><d>”)

lxml库 etree模版

Element 类一一字符串 (
Element0)去节点的字符串 “root”.tostring(成结构 只有左边 没有右边<htm>自动补上:set
Aroot> :
tag
text

Elementtree.类一一字符串(
.fromstring()
.XML)                 把字符串外衣去掉 转换为 XML
.HTML()             把字符串外衣去掉 转换为 HTML
 

Elementpath 类一一寻址(
.xpath(xpath寻址规则
Xpath_寻址规则:
    /      //      @        [==]    xpathhelper 工具

   去掉字符串:.fromstring  .XML    .HTML

   寻址:.xpath(xpath寻址规则/  //  @   )

   百度贴吧(

代码:

import urllib.request
from urllib import request,parse
from lxml import etree
class Tieba(object):
    def __init__(self, name):
        self.url = 'https://tieba.baidu.com/f?kw=%E7%94%B5%E5%BD%B1%E7%A5%A8%E6%88%BF'
        self.headers = {'user-agent': 'Mozilla/4.0 (compatible; MSIE 5.01; Windows NT 5.0)'}

    def get_data(self,url):
        req=urllib.request.Request(url=url,headers=self.headers)
        res=urllib.request.urlopen(req)
        response=res.read().decode()
        return response
    def parse_data(self,data):
        html=etree.HTML(data)
        el_list=html.xpath('//*[@id="thread_list"]/li[3]/div/div[2]/div[1]/div[1]/a')
        print(el_list)
        data_list=[]
        for el in el_list:
            temp = {}
            temp['title'] = el.xpath('./text()')[0]
            temp['link'] = 'https://tieba.baidu.com/' + el.xpath('./@href')[0]
            data_list.append(temp)
        try:
            next_url='https:'+html.xpath('//a[contains(text(),"下一页")]/@href')[0]
        except:
            next_url=None
        return data_list,next_url
    def save_data(self,data_list):
        for data in data_list:
            print(data)
    def run(self):
        next_url=self.url
        while True:
            data=self.get_data(next_url)
            data_list,next_url=self.parse_data(data)
            self.save_data(data_list)
            print(next_url)
            if next_url==None:
                break
if __name__=='__main__':
    tieba=Tieba('')
    tieba.run()

一、当前页的爬取

  urllib request  urlopen 

                         Request

           Parse     urlencode、quote

                          .read()     .

二、

当前页的解析—当前页的标题和标题对应的url地址

当前页的解析—下一页的url地址

三、

当前页的标题和标题对应的url地址——保存

下一页的url地址——继续爬取

四、程序终止条件:没有下一页url地址  try  except)

3、beautifulsoup——HTML XML(“<html><body><a><b><c><d>”)

安装bs4   导入类from bs4 import Beautifulsoup

初始化Beautifulsoup(被寻址的对象,’lxml’)   find寻址

4、json与jsonpath——json(“{body:{a:{b:{c:}}}}”)

导入json模块 调用json.loads()去掉字符串外衣

Jsonpath.jsonpath(被寻址的对象,“$..寻址规则”)


11.20框架构建

window+R:

从爬虫出:

从管道出:

取消pipelines的注释:

安装scrapy框架
1、创建项目 scrapy startproject 项目名字
2、cd到项目下边  
      创建爬虫 scrapy genspider 爬虫名字  爬虫域名
3、修改settings当中ROBOTSTXT_OBEY=****
4、修改爬虫文件中的parse()模块,完成数据的解析提取
      item={}
      item['title']=response.xpath('xpath的语法规则')
      print(item)#这个print'语句用来测试是否到了第六步,不具有最终的功能
5、程序运行:scrapy crawl 爬虫名字
6、在爬虫文件中输入yield item 把item中的内容yield回管道
7、在管道文件pipelines.py 中,增加print()语句来验证是否数据 真正的放到管道中
8、程序并没有结果输出,所以需要修改settings文件 把item_pipeline释放注释,让其真正有效
9、结果输出没结构,LOG_LEVEL='WARNING'设置输出内容为警告及以上


 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值