基于python的爬虫(一)

一.爬虫的基本流程:

# 1、发起请求:
  使用http库向目标站点发起请求,即发送一个Request
  Request包含:请求头、请求体等

# 2、获取响应内容
  如果服务器能正常响应,则会得到一个Response
  Response包含:html,json,图片,视频等

# 3、解析内容
  解析html数据:正则表达式,第三方解析库如Beautifulsoup,pyquery等
  解析json数据:json模块
  解析二进制数据:以b的方式写入文件

# 4、保存数据
  数据库
  文件

二.我们来爬一个校花网

import requests
import re

# 爬虫三部曲

# 一 发送请求
def get_page(url):

    index_res = requests.get(url)
    return index_res.text

# 二 解析数据
# 解析主页
def parse_index(index_page):
    detail_urls = re.findall(‘<div class="items">.*?href="(.*?)"‘, index_page, re.S)
    # print(detail_urls)

    for detail_url in detail_urls:
        if not detail_url.startswith(‘http‘):
            detail_url = ‘http://www.xiaohuar.com‘ + detail_url
        yield detail_url

# 解析详情页
def parse_detail(detail_page):
    video_urls = re.findall(‘id="media".*?src="(.*?)"‘, detail_page, re.S)

    if video_urls:
        video_urls = video_urls[0]
        if video_urls.endswith(‘.mp4‘):
            yield video_urls

    # print(video_urls)

# 三 保存数据
import uuid
def save_video(video_url):
    try:
        res = requests.get(video_url)
        with open(r‘D:\pachong\movies\%s.mp4‘ % uuid.uuid4(), ‘wb‘) as f:
            f.write(res.content)
            f.flush()

    except Exception:
        pass

if __name__ == ‘__main__‘:
    base_url = ‘http://www.xiaohuar.com/list-3-{}.html‘
    for line in range(5):
        index_url = base_url.format(line)

        index_page = get_page(index_url)
        detail_urls = parse_index(index_page)
        for detail_url in detail_urls:
            detail_page = get_page(detail_url)
            video_urls = parse_detail(detail_page)
            for video_url in video_urls:
                save_video(video_url)

并发版:

# pip3 install requests
import requests
import re
from concurrent.futures import ThreadPoolExecutor

pool = ThreadPoolExecutor(50)

# 爬虫三部曲

# 一 发送请求
def get_page(url):
    print(‘%s GET start ...‘ % url)
    index_res = requests.get(url)
    return index_res.text

# 二 解析数据
# 解析主页
def parse_index(index_page):
    # 拿到主页的返回结果
    res = index_page.result()
    detail_urls = re.findall(‘<div class="items">.*?href="(.*?)"‘, res, re.S)
    # print(detail_urls)

    for detail_url in detail_urls:
        if not detail_url.startswith(‘http‘):
            detail_url = ‘http://www.xiaohuar.com‘ + detail_url

        pool.submit(get_page, detail_url).add_done_callback(parse_detail)
        # yield detail_url

# 解析详情页
def parse_detail(detail_page):
    res = detail_page.result()

    video_urls = re.findall(‘id="media".*?src="(.*?)"‘, res, re.S)

    if video_urls:
        video_urls = video_urls[0]
        if video_urls.endswith(‘.mp4‘):
            pool.submit(save_video, video_urls)

    # print(video_urls)

# 三 保存数据
import uuid
def save_video(video_url):
    try:
        res = requests.get(video_url)
        with open(r‘D:\tank\day01\movies\%s.mp4‘ % uuid.uuid4(), ‘wb‘) as f:
            f.write(res.content)
            f.flush()
            print(‘%s done ...‘ % video_url)

    except Exception:
        pass

if __name__ == ‘__main__‘:
    base_url = ‘http://www.xiaohuar.com/list-3-{}.html‘
    for line in range(5):
        index_url = base_url.format(line)
        pool.submit(get_page, index_url).add_done_callback(parse_index)

三.request的基本使用

  1.get请求的两种方式:

import requests
from urllib.parse import urlencode

# 请求url
base_url = ‘https://www.baidu.com/s?‘ + urlencode({"wd": "美女"})
# 请求头
headers = {
    ‘User-Agent‘:‘Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36 SE 2.X MetaSr 1.0‘
}

# 请求方法 GET
res = requests.get(base_url, headers=headers)
 # print(res)            一个response对象 # print(res.text)       整个html文本 # print(res.content)    二进制内容with open(‘meinv.html‘, ‘w‘, encoding=‘utf-8‘) as f:
    f.write(res.text)

每次url编码会很麻烦,所以可以在GET内添加参数即可:

import requests

# 请求url
base_url = ‘https://www.baidu.com/s?‘

# # 请求头
headers = {
    ‘User-Agent‘:‘Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36 SE 2.X MetaSr 1.0‘
}
#
# 请求方法 GET
res = requests.get(base_url, headers=headers, params={"wd": "黄云"})

with open(‘小云云.html‘, ‘w‘, encoding=‘utf-8‘) as f:
    f.write(res.text)

get请求访问知乎:

# 访问知乎

# 请求url
zhi_url = ‘https://www.zhihu.com/explore‘

# # 请求头
headers = {
    ‘User-Agent‘:‘Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36 SE 2.X MetaSr 1.0‘

}
# 请求方法 GET
res = requests.get(zhi_url, headers=headers)
with open(‘知乎.html‘, ‘w‘, encoding=‘utf-8‘) as f:
    f.write(res.text)

get请求访问github:

# # 请求头,登录后的主页
url=‘https://github.com/settings/emails‘
headers = {
‘User-Agent‘: ‘Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.131 Safari/537.36‘,
‘Cookie‘: ‘has_recent_activity=1; _ga=GA1.2.1150787574.1561264746; _octo=GH1.1.800236184.1561264778; _device_id=e38cc770a7f91ac7001f3b1e23185943; user_session=HtVIP7s1AnJA8pBp9PPJN5onsJZ_AJ0mnhXKm-IkGuPYMzDi; __Host-user_session_same_site=HtVIP7s1AnJA8pBp9PPJN5onsJZ_AJ0mnhXKm-IkGuPYMzDi; logged_in=yes; dotcom_user=pengsima; _gat=1; tz=Asia%2FShanghai; _gh_sess=U0hueWR2WmcvMEJ3amVCTFpOVm5KUDFob1FQUHBtd1BYK09ENkU0aTBqK1JrYmFiYTd6K3pLb0pSVDV5UzdOU0oxbGluSDR3dmVJYTA3WlVpaHZ2cWJmQTJrVTQzRHVFa1cvT1hrWG1ON1ZMRm1DeEtkQkhDRUVaK2cwUUpRN29UUnlyWnRCODQ3cTRLYWZkcmN5UHdnPT0tLUgxSmxJMUQzWDllblhFT3JMK083Tnc9PQ%3D%3D--92e621b5b1d19cf03e157bf61e02ded6a1a248c6‘

}
# # 请求头,email
headers_2 = {
‘User-Agent‘: ‘Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.131 Safari/537.36‘,
‘Cookie‘:‘has_recent_activity=1; _ga=GA1.2.1150787574.1561264746; _octo=GH1.1.800236184.1561264778; _device_id=e38cc770a7f91ac7001f3b1e23185943; user_session=HtVIP7s1AnJA8pBp9PPJN5onsJZ_AJ0mnhXKm-IkGuPYMzDi; __Host-user_session_same_site=HtVIP7s1AnJA8pBp9PPJN5onsJZ_AJ0mnhXKm-IkGuPYMzDi; logged_in=yes; dotcom_user=pengsima; _gat=1; tz=Asia%2FShanghai; _gh_sess=SE5mdjlBaWtla3B2czNYZFI5UTF6TEhUbERvellXVTZnUVE3d0hjTDBTb3RtZ0UxTXhYSCt4S2h2NXR2c3h2YVNaZUNITHlCOE9GcmhIM2lweVFVellYMExxV3dEK0R1ZU15cUEycmxIRk4yZW1WT2J5c3hFVHZ4Y3ZOaUhBN0ZseWcyTmMwNWxPTEIrMmpnVVpKRUJRPT0tLTdNcFZsOTFidnpxZk05cWVZUmV0MkE9PQ%3D%3D--6064098de4400f5a7ac71cdd3806abd11b2a0134‘
}
# 请求方法 GET
# res = requests.get(url, headers=headers_2)
res = requests.get(url, headers=headers)
with open(‘github.html‘, ‘w‘, encoding=‘utf-8‘) as f:
    f.write(res.text)
print(‘1059239165‘ in res.text)

# True

 2.post请求

# 第一步 https://github.com/login  >>>>  获取tocken
headers = {
    ‘User-Agent‘:‘Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36 SE 2.X MetaSr 1.0‘

}

login_res = requests.get(‘https://github.com/login‘, headers=headers)
#

authenticity_token = re.findall(‘name="authenticity_token".*?value="(.*?)"‘, login_res.text, re.S)[0]
print(
    authenticity_token
)
# 第二步拿到cookies
cookies = {}

# 把login_cookies放进cookies字典内
cookies.update(login_res.cookies.get_dict())
print(cookies)

# 第三步 往session发送post请求
# 请求方法 POST

# 请求url
#     https://github.com/session  POST

# 请求体

form_data = {
    "commit": "Sign in",
    "utf8": "?",
    "authenticity_token": authenticity_token,
    "login": "pengsima",
    "password": "sa081140510",
    "webauthn-support":" supported"

}

# json
# requests.post(‘https://github.com/session‘, headers=headers, json=form_data)
res = requests.post(‘https://github.com/session‘, headers=headers, data=form_data, cookies=cookies)

# print(res.status_code)

with open(‘github.html‘, ‘w‘, encoding=‘utf-8‘) as f:
    f.write(res.text)

 3.response

import requests

baidu = ‘https://www.baidu.com/‘

headers = {
    ‘User-Agent‘:‘Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36 SE 2.X MetaSr 1.0‘

}

res = requests.get(baidu, headers=headers)

# 返回响应状态码
print(res.status_code)

print(res)
# 响应头
print(res.headers)

# 响应文本
print(res.text)

print(res.url)
#
print(res.cookies)
print(res.cookies.get_dict())

print(res.encoding)
# res.encoding = ‘utf-8‘
# print(res.encoding)

print(res.history)

print(res.content)

下载一张图片:

bo = ‘https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1551942493340&di=afa19a1f5a3a4fbdec983baaeb1954f0&imgtype=0&src=http%3A%2F%2Fwww.xnnews.com.cn%2Fwenyu%2Flxsj%2F201611%2FW020161114828261827516.jpg‘

headers = {
    ‘User-Agent‘:‘Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36 SE 2.X MetaSr 1.0‘

}

res = requests.get(bo, headers=headers, stream=True)
with open(‘bo2.jpg‘, ‘wb‘) as f:
    for line in res.iter_content():
        # f.write(res.content)
        f.write(line)

补充:

  取消重定向(默认为True):
  allow_redriects=False

原文地址:https://www.cnblogs.com/sima-3/p/11074946.html

时间: 2024-10-08 11:17:38

基于python的爬虫(一)的相关文章

基于python的爬虫(一)

抓取网页 python核心库 urllib2 实现对静态网页的抓取,不得不说,"人生苦短,我用python"这句话还是有道理的,要是用java来写,这估计得20行代码 (对不住了博客园了,就拿你开刀吧) def staticFetch(): url = "http://www.cnblogs.com/" request = urllib2.Request(url) response = urllib2.urlopen(request) print response.

基于python的爬虫流程图(精简版)

网址: https://www.processon.com/view/link/5e1148b8e4b07db4cfa9cf34 如果链接失效,请及时反馈(在评论区评论),博主会及时更新 原文地址:https://www.cnblogs.com/wengxiaobin/p/12174513.html

基于Python的urllib2模块的多线程网络爬虫程序

1 m Queue import Queue 2 from gzip import GzipFile 3 from StringIO import StringIO 4 import time 5 import socket 6 class ContentEncodingProcessor(urllib2.BaseHandler): 7 """A handler to add gzip capabilities to urllib2 requests ""

基于python的知乎开源爬虫 zhihu_oauth使用介绍

今天在无意之中发现了一个知乎的开源爬虫,是基于Python的,名字叫zhihu_oauth,看了一下在github上面star数还挺多的,貌似文档也挺详细的,于是就稍微研究了一下.发现果然很好用啊.就在这里给大家介绍一下如何使用. 项目的主页地址在:https://github.com/7sDream/zhihu-oauth.作者的知乎主页为:https://www.zhihu.com/people/7sdream/. 项目的文档地址为:http://zhihu-oauth.readthedoc

基于Scrapy框架的Python新闻爬虫

概述 该项目是基于Scrapy框架的Python新闻爬虫,能够爬取网易,搜狐,凤凰和澎湃网站上的新闻,将标题,内容,评论,时间等内容整理并保存到本地 详细 代码下载:http://www.demodashi.com/demo/13933.html 一.开发背景 Python作为数据处理方面的一把好手,近年来的热度不断增长.网络爬虫可以说是Python最具代表性的应用之一,那么通过网络爬虫来学习Python以及网络和数据处理的相关内容可以说是再合适不过了. Scrapy是由Python语言开发的一

Python网络爬虫

http://blog.csdn.net/pi9nc/article/details/9734437 一.网络爬虫的定义 网络爬虫,即Web Spider,是一个很形象的名字. 把互联网比喻成一个蜘蛛网,那么Spider就是在网上爬来爬去的蜘蛛.网络蜘蛛是通过网页的链接地址来寻找网页的. 从网站某一个页面(通常是首页)开始,读取网页的内容,找到在网页中的其它链接地址, 然后通过这些链接地址寻找下一个网页,这样一直循环下去,直到把这个网站所有的网页都抓取完为止. 如果把整个互联网当成一个网站,那么

基于Python Spark的大数据分析_pyspark实战项目课程

基于Python Spark的大数据分析(第一期) 课程介绍地址:http://www.xuetuwuyou.com/course/173 课程出自学途无忧网:http://www.xuetuwuyou.com 讲师:轩宇老师 1.开课时间:小班化教学授课,第一期开课时间为5月20号(满30人开班,先报先学!): 2.学习方式:在线直播,共8次课,每次2小时,每周2次(周三.六,晚上20:30 - 22:30),提供在线视频,课后反复学习: 3.报名课程后,请联系客服申请加入班级答疑交流QQ群:

第三百五十八节,Python分布式爬虫打造搜索引擎Scrapy精讲—将bloomfilter(布隆过滤器)集成到scrapy-redis中

第三百五十八节,Python分布式爬虫打造搜索引擎Scrapy精讲-将bloomfilter(布隆过滤器)集成到scrapy-redis中,判断URL是否重复 布隆过滤器(Bloom Filter)详解 基本概念 如果想判断一个元素是不是在一个集合里,一般想到的是将所有元素保存起来,然后通过比较确定.链表,树等等数据结构都是这种思路. 但是随着集合中元素的增加,我们需要的存储空间越来越大,检索速度也越来越慢.不过世界上还有一种叫作散列表(又叫哈希表,Hash table)的数据结构.它可以通过一

2017.07.28 Python网络爬虫之爬虫实战 今日影视2 获取JS加载的数据

1.动态网页指几种可能: 1)需要用户交互,如常见的登录操作: 2)网页通过js / AJAX动态生成,如一个html里有<div id="test"></div>,通过JS生成<divid="test"><span>aaa</span></div>: 3)点击输入关键字后进行查询,而浏览器url地址不变 2.想用Python获取网站中JavaScript返回的数据,目前有两种方法: 第一种方法