Python爬虫Demo

爬取豆瓣合租房信息

#导入re模块,用于正则表达式匹配
import re
#导入requests模块,用于HTTP请求
import requests
#导入json模块,用于将字典转换为json格式
import json
#导入RequsetsException模块,用于捕获异常
from requests.exceptions import RequestException

#定义抓取HTML代码的函数,参数为HTTP请求的URL
def get_response(url):
    #捕获异常
    try:
        #添加headers信息,防止访问拒绝
        headers = {'User-Agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.104 Safari/537.36 Core/1.53.3357.400 QQBrowser/9.6.11858.400'}
        #获取响应体
        response = requests.get(url,headers)
        #使用响应体中状态码判断是否请求成功
        if response.status_code==200:
            #如果请求成功就返回响应体中的代码
            return response.text
        else:
            #如果请求失败就返回None
            return None
    except RequestException:
        #如果捕获到异常就返回None
        return None

#定义获取匹配结果函数,参数为返回的HTML代码
def get_html(html):
    #将正则表达式字符串转换为正则表达式对象
    pattern = re.compile('<tr\sclass="">.*?href="(.*?)".*?class="">(.*?)</a>.*?class="">(.*?)</a></td>.*?class="">(.*?)</td>.*?class="time">(.*?)</td>.*?</tr>',re.S)
    #将匹配结果赋值给items
    items = re.findall(pattern,html)
    #items此时是一个list(列表),每个列表中包含的是元祖,需要遍历将每组信息规范
    for item in items:
        #将每个元祖转换为生成器并返回,yield会自动将结果返回给调用者
        yield {"URL":item[0],
            "title":item[1],
            "ID":item[2],
            "回帖数":item[3],
            "date":item[4]}

#定义写入文件函数,参数为正则表达式匹配出的字典格式(dict)
def write_file(item):
    #以append方式追加写入文件,且指定编码格式
    with open("file.txt", 'a', encoding='utf-8')as f:
        #将字典(dict)格式转换为json格式(json.dumps()函数转换),写入文件。'ensure_ascii=False'意为不使用ascii编码
        f.write(json.dumps(item, ensure_ascii=False) + '\n')
        f.close()

#定义主函数
def main():
    #定义HTTP请求URL
    url = 'https://www.douban.com/group/hezu/'
    #调用获取代码函数赋值给html
    html = get_response(url)
    #遍历'get_html()'函数返回的生成器,遍历后的'item'是字典(dict)
    for item in get_html(html):
        #调用写入文件函数,将字典传入
        write_file(item)

#__name__是内置的变量,在直接执行时等于__main__,作用是可以判断当前文件是直接执行还是被导入的模块
if __name__=='__main__':
    #调用main()函数
    main()

JavaScript网页爬取

爬取今日头条街拍图片

import requests
from requests.exceptions import RequestException
import re
import json
from urllib.parse import urlencode
from bs4 import BeautifulSoup
from config import *
import pymongo
import os
from hashlib import md5
from multiprocessing import Pool

client = pymongo.MongoClient(MONGO_URL)
db = client[MONGO_DB]

#获取索引页的内容
def get_page_index(offset,keyword):
    #原始URL所携带的参数
    data = {
        'offset':offset,
        'format':'json',
        'keyword':keyword,
        'autoload':'true',
        'count':'20',
        'cur_tab':3
    }
    #'urlencode'可以将字典对象转换成url的请求参数
    url = 'http://www.toutiao.com/search_content/?'+urlencode(data)
    #异常捕获
    try:
        #获取响应体
        response = requests.get(url)
        #状态码判断
        if response.status_code==200:
            #返回响应体中的内容,此处返回的内容格式为JSON
            return response.text
        else:
            return None
    except RequestException:
        print("请求索引页出错")
        return None

#解析索引页
def parse_page_index(html):
    #将传入的'html'(实为json字符串)转换为json对象
    data = json.loads(html)
    #判断data数据中是否有'data'这个键
    if data and 'data' in data.keys():
        #如果有就获取这个键包含的数据,遍历出来
        for item in data.get('data'):
            #生成器再返回item中的article_url属性的值,这个值就是详情页的URL
            yield item.get('article_url')

#获取详情页中的内容,思路和获取索引页完全相同
def get_page_detail(url):
    try:
        response = requests.get(url)
        if response.status_code==200:
            return response.text
        else:
            return None
    except RequestException:
        print("请求详情页出错",url)
        return None

#解析详情页
def parse_page_detail(html,url):
    #创建一个BeautifulSoup对象,第一个参数为解析内容,也就是详情页的源代码,第二个参数为解析库,这里用的是'lxml'库
    soup = BeautifulSoup(html,'lxml')
    #获取soup对象中title标签中的文本,也就是详情页的标题
    title = soup.select('title')[0].get_text()
    #创建正则表达式对象
    images_pattern = re.compile('gallery: (.*),.*?siblingList',re.S)
    #搜索gallery中的内容,也就是详情页中每张图片的URL
    result = re.search(images_pattern,html)
    #判断,如果result不为None
    if result:
        #将匹配到的内容,也就是包含每张图片URL的JSON数据转为JSON对象
        data = json.loads(result.group(1))
        #获取每张图片的URL
        if data and 'sub_images' in data.keys():
            sub_images = data.get('sub_images')
            images = [item.get('url') for item in sub_images]
            #遍历所有图片URL
            for image in images:
                #下载图片
                download_image(image)
            return {
                'title':title,
                'url':url,
                'images':images
            }

#保存到数据库
def save_to_mongo(result):
    if db[MONGO_TABLE].insert(result):
        return True
    return False

#下载图片
def download_image(url):
    print('正在下载',url)
    try:
        response = requests.get(url)
        if response.status_code == 200:
            #保存图片
            save_image(response.content)
        else:
            return None
    except RequestException:
        print("下载图片出错", url)
        return None
#保存图片
def save_image(content):
    file_path = '{0}/{1}.{2}'.format(os.getcwd(),md5(content).hexdigest(),'jpg')
    if not os.path.exists(file_path):
        with open(file_path,'wb') as f:
            f.write(content)
            f.close()

#主函数
def main(offset):
    #获取索引页
    html = get_page_index(offset,'街拍')
    #根据解析索引页函数,遍历详情页URL
    for url in parse_page_index(html):
        #获取详情页
        html = get_page_detail(url)
        if html:
            #解析详情页
            result = parse_page_detail(html,url)
            #将数据保存到数据库
            if result:save_to_mongo(result)


if __name__=='__main__':
    groups = [x*20 for x in range(GROUP_START,GROUP_END+1)]
    pool = Pool()
    pool.map(main,groups)

饿了么数据爬虫

import requests
from requests.exceptions import RequestException
import re
import json
from urllib.parse import urlencode
from bs4 import BeautifulSoup

import pymongo
import os
from hashlib import md5
from multiprocessing import Pool
import xlwt

client = pymongo.MongoClient('localhost')
db = client['23']




#获取索引页的内容
def get_page_index(offset):
    #原始URL所携带的参数
    data = {
        'extras[]':'activities',
        'geohash':'wm6n2njwtbr',
        'latitude':30.66396,
        'limit':24,
        'longitude':104.07031,
        'offset':offset,
        'terminal':'web'
    }
    #'urlencode'可以将字典对象转换成url的请求参数
    url = 'https://www.ele.me/restapi/shopping/restaurants?'+urlencode(data)
    #异常捕获
    try:
        #获取响应体
        response = requests.get(url)
        #状态码判断
        if response.status_code==200:
            #返回响应体中的内容,此处返回的内容格式为JSON
            return response.text
        else:
            return None
    except RequestException:
        print("请求索引页出错")
        return None

#解析索引页
def parse_page_index(html):
    # 将传入的'html'(实为json字符串)转换为json对象
    data = json.loads(html)
    for item in data:
       yield {
           'name':item.get('name'),
           'address':item.get('address'),
           'phone':item.get('phone')
       }

# 定义写入文件函数,参数为正则表达式匹配出的字典格式(dict)
def write_file(item):
   # 以append方式追加写入文件,且指定编码格式
   with open("file.txt", 'a', encoding='utf-8')as f:
    # 将字典(dict)格式转换为json格式(json.dumps()函数转换),写入文件。'ensure_ascii=False'意为不使用ascii编码
    f.write(json.dumps(item, ensure_ascii=False) + '\n')
    print('写入成功!')
    f.close()


#主函数
def main():
    a=0
    while a<99999:
        #获取索引页
        html = get_page_index(a)
        for result in parse_page_index(html):
            print(result)
            write_file(result)
        a = a + 24





if __name__=='__main__':
    main()
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值