python3网络爬虫(堆糖网)

本文介绍了使用Python3的requests库进行网络爬虫,以堆糖网为例,详细讲解如何抓取网站数据。通过实例演示请求网页、处理响应及解析HTML内容,揭示网络爬虫的基本流程。
摘要由CSDN通过智能技术生成

1.requests库

import requests
requests.get( ' http://www.dict.baidu.com/s ', params={ ' wd '' python '})    # GET参数实例
requests.post( ' http://www.itwhy.org/wp-comments-post.php ', data={ ' comment '' 测试POST '})    # POST参数实例
可以使用get进行接收,获取一个response对象,可用text方法进行解码
r = requests.get( ' http://www.itwhy.org ')
其他方法如下

r.status_code #响应状态码
r.raw #返回原始响应体,也就是 urllib 的 response 对象,使用 r.raw.read() 读取
r.content #字节方式的响应体,会自动为你解码 gzip 和 deflate 压缩
r.text #字符串方式的响应体,会自动根据响应头部的字符编码进行解码
r.headers #以字典对象存储服务器响应头,但是这个字典比较特殊,字典键不区分大小写,若键不存在则返回None
#*特殊方法*#
r.json() #Requests中内置的JSON解码器
r.raise_for_status() #失败请求(非200响应)抛出异常

2.字符串查找
String.find('aaa',pos)查找的字符串,pos为查找位置,返回为开头位置
def find_in_page(page,startpart,endpart):
    image_url=[]
    end= 0
    while page.find(startpart,end)!=- 1:
        start=page.find(startpart,end)+ len(startpart)
        end=page.find(endpart,start)
        string=page[start:end]
        image_url.append(string)
    return image_url
也可以用正则匹配,之后再研究吧

3.线程
使用threading库
# 设置线程锁
thread_lock = threading.BoundedSemaphore( value= 10)
thread_lock.acquire()
t=threading.Thread( target=download_pic, args=(pic_url, label, n))
t.start()
thread_lock.release()
使用线程锁进行线程任务,要记得任务完成后释放线程


完整代码

import requests
import urllib
from bs4 import BeautifulSoup
import lxml
import os
import threading
import json

# 设置线程锁
thread_lock = threading.BoundedSemaphore(value=10)
# 获取url
def page_from_url(url):
    html = requests.get(url).content.decode('utf-8')
    return html
# 找出相关label
def page_from_label(label):
    pages=[]
    label = urllib.parse.quote(label)
    url = 'https://www.duitang.com/napi/blog/list/by_search/?kw={}&start={}&limit=1000'

   for i in range(0,3000,100):
        new_url = url.format(label,i)
        page=page_from_url(new_url)
        pages.append(page)
    return pages
# 从page中爬出图片
def find_in_page(page,startpart,endpart):
    image_url=[]
    end=0
    while page.find(startpart,end)!=-1:
        start=page.find(startpart,end)+len(startpart)
        end=page.find(endpart,start)
        string=page[start:end]
        image_url.append(string)
    return image_url
# 下载图片
def download_pic(url,label,n):
    r = requests.get(url)
    path = 'pics//'+str(label)+'//'+str(n)+'.jpeg'
    print('正在下载第'+str(n)+'张图片')
    with open(path,'wb') as f:
        f.write(r.content)
        thread_lock.release()

# url='https://www.duitang.com/napi/blog/list/by_search/?kw=%E7%A9%B9%E5%A6%B9cos&start=0&limit=1000'


def main(label):
    pages = page_from_label(label)
    n=0
    for page in pages:
        pics_url=find_in_page(page, 'path":"', '"')
        for pic_url in pics_url:
            n+=1
            # download_pic(pic_url, label, n)
            thread_lock.acquire()
            t=threading.Thread(target=download_pic,args=(pic_url, label, n))
            t.start()



label = '守望先锋'#label的东西改变即可
if __name__=='__main__':
    os.makedirs('pics//'+str(label))
    main(label)


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值