Python网络爬虫(正则, 内涵段子,猫眼电影, 链家爬取)

简介: python、python爬虫、网络爬虫、爬虫框架、selenium、requests、urllib、数据分析、大数据、爬虫爬取静态网页、爬虫基础
正则表达式(re模块):
    数据的分类:
        结构化数据
            有固定的格式 如HTML、XML、JSON
        非结构化数据
            图片、音频、视频 这类数据一般存储为二进制
    正则:
        使用流程:
            创建编译对象:p = re.compile("正则表达式")
            对字符串匹配:r = p.match("字符串")
            获取匹配结果:print(r.group())
        常用方法:
            match(str)  字符串开头的第一个  返回对象
            search(str) 从头开始匹配 只匹配一个 返回对象
            group()     从match或search对象中取值
            findall()   所有全局匹配  返回一个列表
        表达式:
            .   匹配任意字符(除了\n)
            \d  匹配数字
            \s  空白字符
            \S  非空字符
            []  匹配括号内所有内容
            \w  字母、数字、下划线
            *   前一个出现0次或多次
            ?   0次或1次
            +   一次或多次
            {m} m次
            {m, n} m到n次

        贪婪匹配:
            再整个表达式匹配成功前提下 尽可能多的去匹配*
        非贪婪匹配:
            再整个表达式匹配成功前提下 尽可能少的去匹配*
    示例(贪婪模式和非贪婪模式)

import re

s = """<div><p>年发的斯蒂芬是否</div></p>
<div><p>年发的斯蒂芬是否</div></p>
"""
# 创建编译对象 贪婪匹配  re.S代表让.可以匹配\n字符
p = re.compile("<div><p>.*</div></p>", re.S)
# 匹配字符串s
r = p.findall(s)
# 结果为一个列表内只有与一个元素
print(r)

# 非贪婪匹配 用?尽可能少的去匹配
p = re.compile("<div><p>.*?</div></p>", re.S)
# 匹配字符串s
r = p.findall(s)
# 结果为一个列表内有多个元素
print(r)

    findall()的分组

	import re
	#解释 :先按照整体匹配出来,然后再匹配()中的
	# 如果有2个或者多个(),则以元组的方式取显示

	s = "A B C D"
	p1 = re.compile('\w+\s+\w+')
	print(p1.findall(s))
	# ['A B','C D']

	p2 = re.compile('(\w+)\s+\w+')
	# 第1步 :['A B','C D']
	# 第2步 :['A','C']
	print(p2.findall(s))

	p3 = re.compile('(\w+)\s+(\w+)')
	# 第1步 :['A B','C D']
	# 第2步 :[('A','B'),('C','D')]
	print(p3.findall(s))


    7、案例1 :内涵段子脑筋急转弯抓取

# 思路
# 
#  网址 :www.neihan8.com
#   步骤:
#     1、找URL规律
#  第1页:https://www.neihan8.com/njjzw/
#  第2页:https://www.neihan8.com/njjzw/index_2.html
#  第3页:https://www.neihan8.com/njjzw/index_3.html
# 用正则匹配出 题目 和 答案
#   p = re.compile('<div class="text-.*?title="(.*?)".*?<div class="desc">(.*?)</div>',re.S)
# 写代码
#   发请求
#   用正则匹配
#   写入本地文件


import urllib.request
import re
import random


class NeihanSpider(object):
    def __init__(self):
        self.baseurl = "http://www.neihan8.com/wenzi/"
        self.headers = {"User-Agent": "Mozilla/5.0"}
        self.page = 1

    # 下载页面
    def load_page(self, url):
        # 随机获取1个User-Agent
        header_list = [{
            "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36"},
            {"User-Agent": "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/534.50 (KHTML, like Gecko) Version/5.1 Safari/534.50"},
            {"User-Agent": "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0; GTB7.0)"}]
        headers = random.choice(header_list)
        req = urllib.request.Request(url, headers=headers)
        res = urllib.request.urlopen(req)
        html = res.read().decode("utf-8")
        self.parse_page(html)

    # 解析页面
    def parse_page(self, html):
        p = re.compile(r'''<div class="text-.*?"title="(.*?)">.*?class="desc">(.*?)</div>''')
        r_list = p.findall(html)
        self.write_page(r_list)

    # 保存页面
    def write_page(self, r_list):
        for r_tuple in r_list:
            for r_str in r_tuple:
                with open("急转弯.txt", "a", encoding="gb18030") as f:
                    f.write(r_str.strip() + "\n")

    # 主函数
    def work_on(self):
        self.load_page(self.baseurl)
        while True:
            c = input("是否继续...(y/n)")
            if c.strip().lower() == "y":
                self.page += 1
                url = self.baseurl + "index_1.html"
                self.load_page(url)
            else:
                break


if __name__ == "__main__":
    sipder = NeihanSpider()
    sipder.work_on()
 
    猫眼电影top100榜单,存到csv表格文件中
      网址:猫眼电影 - 榜单 - top100榜
      目标:抓取电影名、主演、上映时间
      知识点讲解
        csv模块的使用流程
  打开csv文件
    with open("测试.csv","a") as f:
  初始化写入对象
    writer = csv.writer(f)
  写入数据
    writer.writerow(列表)

import csv

with open("猫眼.csv", "a") as f:
    # 初始化写入对象
    writer = csv.writer(f)
    writer.writerow(["霸王别姬", "张国荣"])
    writer.writerow(["唐伯虎点秋香", "周星驰"])

      准备工作
        找URL
  第1页:http://maoyan.com/board/4?offset=0
  第2页:http://maoyan.com/board/4?offset=10
  第n页:
    offset = (n-1)*10
正则匹配
  <div class="movie-item-info">.*?title="(.*?)".*?<p class="star">(.*?)</p>.*?releasetime">(.*?)</p>

import random
import re
import urllib.request
import UserAgent
import csv

class MovieRanking(object):
    def __init__(self):
        self.baseurl = "http://maoyan.com/board/4?offset="
        self.headers = random.choice(UserAgent.headers_list)
        self.page = 0

    def read_page(self, url):
        requuest = urllib.request.Request(url, headers=self.headers)
        response = urllib.request.urlopen(requuest)
        html = response.read().decode("utf-8")
        self.parse_page(html)

    def parse_page(self, html):
        p = re.compile(r'''<p class="name".*?title="(.*?)".*?class="star">(.*?)</p>.*?class="releasetime">(.*?)</p>''', re.S)
        movie_list = p.findall(html)
        self.write_page(movie_list)

    def write_page(self, movie_list):
        for movie in movie_list:
            movie_list = [movie[0].strip(), movie[1].strip(), movie[2].strip()]
            with open("猫眼Top.csv", "a", encoding="utf-8") as f:
                writer = csv.writer(f)
                writer.writerow(movie_list)


    def main_page(self, number):
        i = 0
        while i < number:
            url = self.baseurl + str(self.page)
            self.read_page(url)
            self.page += 1
            i += 1


if __name__ == "__main__":
    movie = MovieRanking()
    movie.main_page(100)


Fiddler常用菜单
  Inspector : 查看抓到的数据包的详细内容
    分为请求(request)和响应(response)两部分
  常用选项
Headers :显示客户端发送到服务器的header,包含客户端信息、cookie、传输状态
WebForms :显示请求的POST数据 <body>
Raw :将整个请求显示为纯文本
请求方式及案例
  GET
  POST
  Cookie模拟登陆
    什么是cookie、session
      HTTP是一种无连接协议,客户端和服务器交互仅仅限于 请求/响应过程,结束后断开,下一次请求时,服务器会认为是一个新的客户端,为了维护他们之间的连接,让服务器知道这是前一个用户发起的请求,必须在一个地方保存客户端信息。
      cookie :通过在客户端记录的信息确定用户身份
      session :通过在服务端记录的信息确定用户身份
        使用cookie模拟登陆人人网

'''cookie模拟登陆人人网.py'''
import urllib.request

# 步骤:
#     通过抓包工具、F12获取到cookie(先登陆1次网站)
#     正常发请求
#     url:http://www.renren.com/967469305/profile

url = "http://www.renren.com/967469305/profile"
headers = {
        "Host":"www.renren.com",
        "Connection":"keep-alive",
        "Upgrade-Insecure-Requests":"1",
        "User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36",
        "Accept":"text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8",
        "Referer":"http://www.renren.com/",
        "Accept-Language":"zh-CN,zh;q=0.9",
        "Cookie":"anonymid=jnoaljpk7d3nh2; depovince=BJ; _r01_=1; _de=4DBCFCC17D9E50C8C92BCDC45CC5C3B7; ln_uact=13603263409; ln_hurl=http://head.xiaonei.com/photos/0/0/men_main.gif; jebe_key=1b1f4a34-0468-4185-a3b0-6f2c38abc368%7C2012cb2155debcd0710a4bf5a73220e8%7C1540454149943%7C1%7C1540454153787; wp_fold=0; wp=0; jebecookies=2fc339e7-1b51-43ce-bc85-e2dc1f68ee16|||||; JSESSIONID=abcANrnqoMuLshY34pQAw; ick_login=30d0bd58-f6bb-437f-8d0d-6a72ae00e7b7; p=1e1b85cb8dda387a70e400a341c2e9c95; first_login_flag=1; t=4f652cc0a8f3fd50f5c9095c92d4717d5; societyguester=4f652cc0a8f3fd50f5c9095c92d4717d5; id=967469305; xnsid=55bff2d5; loginfrom=syshome"
    }

req = urllib.request.Request(url,headers=headers)
res = urllib.request.urlopen(req)
print(res.read().decode("utf-8"))



requests模块
    安装(用管理员身份去打开Anaconda Prompt)
    Anaconda   : conda install requests
    Windows cmd: python -m pip install requests
      ## 以管理员身份去执行pip安装命令
    常用方法
    get(url,headers=headers) : 发起请求,获取响应对象
    response属性
      response.text :返回字符串类型
      response.content : 返回bytes类型
     应用场景 :爬取非结构化数据
      response.encoding 
        一般返回 :ISO-8859-1  # latin1
指定编码:response.encoding = "utf-8"
      response.status_code :返回服务器响应码
      response.url :返回数据的URL地址
    get()使用场景
      没有查询参数
        res = requests.get(url,headers=headers)
      有查询参数: params={}
        注 :params参数必须为字典,自动进行编码
见 :09_requests.get.params.py
    post() 参数名 :data
      data = {}

爬取链家二手房

import csv
import re
import requests


class HouseReptile(object):

    def __init__(self):
        self.headers = {"User-Agent": "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.95 Safari/537.36 OPR/26.0.1656.60"}
        self.base_url = "https://jn.lianjia.com/ershoufang/pg"
        self.pg = 0
        print("初始化~")

    def read_house(self, url):
        print("读取数据")
        response = requests.get(url, self.headers)
        self.parse_house(response.text)

    def parse_house(self, html):
        print("开始解析数据")
        # 详情页  标题  小区名  规格  楼层 发布时间  总价 单价
        mate = re.compile('''<div class="title"><a class="" href="(.*?)".*?data-is_focus="" data-sl="">(.*?)</a>.*?data-el="region">(.*?)</a> (.*?)<.*?</span>(.*?)<.*?starIcon"></span>(.*?)<.*?<span>(\d+)</span>万.*?<span>(.*?)</span>''', re.S)
        house_list = mate.findall(html)
        self.write_house(house_list)


    def write_house(self, house_list):
        for house in house_list:
            with open("链接二手房.csv", "a", newline="", encoding="utf-8") as f:
                writer = csv.writer(f)
                house = [
                    house[0].strip(),
                    house[1].strip(),
                    house[2].strip(),
                    house[3].strip(),
                    house[4].strip(),
                    house[5].strip(),
                    house[6].strip(),
                    house[7].strip()
                ]
                writer.writerow(house)


    def crawl_house(self, number):
        if self.pg == 0:
            with open("链接二手房.csv", "a", newline="", encoding="utf-8") as f:
                writer = csv.writer(f)
                writer.writerow([
                    "房屋详情链接",
                    "标题",
                    "小区名",
                    "规格",
                    "楼层",
                    "发布时间",
                    "总价(万)",
                    "单价"
                ])

        for i in range(0, number):
            self.pg += 1
            url = self.base_url + str(self.pg)
            print("开始爬取:", url)
            self.read_house(url)


if __name__ == "__main__":
    house = HouseReptile()
    house.crawl_house(3)



        
      












相关文章
|
21天前
|
机器学习/深度学习 人工智能 算法
猫狗宠物识别系统Python+TensorFlow+人工智能+深度学习+卷积网络算法
宠物识别系统使用Python和TensorFlow搭建卷积神经网络,基于37种常见猫狗数据集训练高精度模型,并保存为h5格式。通过Django框架搭建Web平台,用户上传宠物图片即可识别其名称,提供便捷的宠物识别服务。
221 55
|
2月前
|
数据采集 缓存 定位技术
网络延迟对Python爬虫速度的影响分析
网络延迟对Python爬虫速度的影响分析
|
2月前
|
Python
Python中的异步编程:使用asyncio和aiohttp实现高效网络请求
【10月更文挑战第34天】在Python的世界里,异步编程是提高效率的利器。本文将带你了解如何使用asyncio和aiohttp库来编写高效的网络请求代码。我们将通过一个简单的示例来展示如何利用这些工具来并发地处理多个网络请求,从而提高程序的整体性能。准备好让你的Python代码飞起来吧!
91 2
|
1月前
|
机器学习/深度学习 人工智能 算法
【宠物识别系统】Python+卷积神经网络算法+深度学习+人工智能+TensorFlow+图像识别
宠物识别系统,本系统使用Python作为主要开发语言,基于TensorFlow搭建卷积神经网络算法,并收集了37种常见的猫狗宠物种类数据集【'阿比西尼亚猫(Abyssinian)', '孟加拉猫(Bengal)', '暹罗猫(Birman)', '孟买猫(Bombay)', '英国短毛猫(British Shorthair)', '埃及猫(Egyptian Mau)', '缅因猫(Maine Coon)', '波斯猫(Persian)', '布偶猫(Ragdoll)', '俄罗斯蓝猫(Russian Blue)', '暹罗猫(Siamese)', '斯芬克斯猫(Sphynx)', '美国斗牛犬
160 29
【宠物识别系统】Python+卷积神经网络算法+深度学习+人工智能+TensorFlow+图像识别
|
6天前
|
算法 网络协议 Python
探秘Win11共享文件夹之Python网络通信算法实现
本文探讨了Win11共享文件夹背后的网络通信算法,重点介绍基于TCP的文件传输机制,并提供Python代码示例。Win11共享文件夹利用SMB协议实现局域网内的文件共享,通过TCP协议确保文件传输的完整性和可靠性。服务器端监听客户端连接请求,接收文件请求并分块发送文件内容;客户端则连接服务器、接收数据并保存为本地文件。文中通过Python代码详细展示了这一过程,帮助读者理解并优化文件共享系统。
|
1月前
|
机器学习/深度学习 人工智能 算法
深度学习入门:用Python构建你的第一个神经网络
在人工智能的海洋中,深度学习是那艘能够带你远航的船。本文将作为你的航标,引导你搭建第一个神经网络模型,让你领略深度学习的魅力。通过简单直观的语言和实例,我们将一起探索隐藏在数据背后的模式,体验从零开始创造智能系统的快感。准备好了吗?让我们启航吧!
74 3
|
2月前
|
网络安全 Python
Python网络编程小示例:生成CIDR表示的IP地址范围
本文介绍了如何使用Python生成CIDR表示的IP地址范围,通过解析CIDR字符串,将其转换为二进制形式,应用子网掩码,最终生成该CIDR块内所有可用的IP地址列表。示例代码利用了Python的`ipaddress`模块,展示了从指定CIDR表达式中提取所有IP地址的过程。
57 6
|
2月前
|
机器学习/深度学习 自然语言处理 语音技术
Python在深度学习领域的应用,重点讲解了神经网络的基础概念、基本结构、训练过程及优化技巧
本文介绍了Python在深度学习领域的应用,重点讲解了神经网络的基础概念、基本结构、训练过程及优化技巧,并通过TensorFlow和PyTorch等库展示了实现神经网络的具体示例,涵盖图像识别、语音识别等多个应用场景。
72 8
|
2月前
|
数据采集 XML 存储
构建高效的Python网络爬虫:从入门到实践
本文旨在通过深入浅出的方式,引导读者从零开始构建一个高效的Python网络爬虫。我们将探索爬虫的基本原理、核心组件以及如何利用Python的强大库进行数据抓取和处理。文章不仅提供理论指导,还结合实战案例,让读者能够快速掌握爬虫技术,并应用于实际项目中。无论你是编程新手还是有一定基础的开发者,都能在这篇文章中找到有价值的内容。
|
2月前
|
机器学习/深度学习 人工智能 算法
基于Python深度学习的【垃圾识别系统】实现~TensorFlow+人工智能+算法网络
垃圾识别分类系统。本系统采用Python作为主要编程语言,通过收集了5种常见的垃圾数据集('塑料', '玻璃', '纸张', '纸板', '金属'),然后基于TensorFlow搭建卷积神经网络算法模型,通过对图像数据集进行多轮迭代训练,最后得到一个识别精度较高的模型文件。然后使用Django搭建Web网页端可视化操作界面,实现用户在网页端上传一张垃圾图片识别其名称。
94 0
基于Python深度学习的【垃圾识别系统】实现~TensorFlow+人工智能+算法网络