Py学习  »  Python

分享几个对于今天来说能帮助你的Python源码

python • 5 年前 • 306 次点击  


5.20
我爱你


爬取妹子图小姐姐(安慰一下幼小的心灵)


  1. #!/usr/bin/env python

  2. # coding=utf-8

  3. import os

  4. import time

  5. import threading

  6. from multiprocessing import Pool, cpu_count

  7. import requests

  8. from bs4 import BeautifulSoup

  9. headers = {

  10.    'X-Requested-With': 'XMLHttpRequest',

  11.    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) '

  12.                  'Chrome/56.0.2924.87 Safari/537.36',

  13.    'Referer': "http://www.mmjpg.com"

  14. }

  15. dir_path = r"E:\mmjpg"      # 下载图片保存路径

  16. def save_pic(pic_src, pic_cnt):

  17.    """ 将图片下载到本地文件夹 """

  18.    try:

  19.        img = requests.get(pic_src, headers=headers, timeout=10)

  20.        imgname = "pic_cnt_{}.jpg". format(pic_cnt + 1)

  21.        with open(imgname, 'ab') as f:

  22.            f.write(img.content)

  23.            print(imgname)

  24.    except Exception as e:

  25.        print(e )

  26. def make_dir(folder_name):

  27.    """ 新建套图文件夹并切换到该目录下 """

  28.    path = os.path.join(dir_path, folder_name)

  29.    # 如果目录已经存在就不用再次爬取了,去重,提高效率。存在返回 False,否则反之

  30.    if not os.path.exists(path):

  31.        os.makedirs(path)

  32.        print(path)

  33.        os.chdir(path)

  34.        return True

  35.    print("Folder has existed!")

  36.    return False

  37. def delete_empty_dir(dir):

  38.    """ 如果程序半路中断的话,可能存在已经新建好文件夹但是仍没有下载的图片的情况

  39.    但此时文件夹已经存在所以会忽略该套图的下载,此时要删除空文件夹 """

  40.    if os.path.exists(dir):

  41.        if os.path.isdir(dir):

  42.            for d in os.listdir(dir):

  43.                path = os.path.join(dir, d)     # 组装下一级地址

  44.                if os. path.isdir(path):

  45.                    delete_empty_dir(path)      # 递归删除空文件夹

  46.        if not os.listdir(dir):

  47.            os.rmdir(dir)

  48.            print("remove the empty dir: {}".format(dir))

  49.    else:

  50.         print("Please start your performance!") # 请开始你的表演

  51. lock = threading.Lock()     # 全局资源锁

  52. def urls_crawler(url):

  53.    """ 爬虫入口,主要爬取操作 """

  54.    try:

  55.        r = requests.get(url, headers=headers, timeout=10). text

  56.        # 套图名,也作为文件夹名

  57.        folder_name = BeautifulSoup(r, 'lxml').find('h2').text.encode('ISO-8859-1').decode('utf-8')

  58.        with lock:

  59.            if make_dir(folder_name):

  60.                # 套图张数

  61.                max_count = BeautifulSoup(r, 'lxml').find('div', class_='page').find_all('a')[-2].get_text()

  62.                # 套图页面

  63.                page_urls = [url + "/" + str(i) for i in range(1, int(max_count) + 1)]

  64.                # 图片地址

  65.                img_urls = []

  66.                for index, page_url in enumerate(page_urls):

  67.                    result = requests.get(page_url, headers=headers, timeout=10).text

  68.                    # 最后一张图片没有a标签直接就是img所以分开解析

  69.                    if index + 1 < len(page_urls):

  70.                        img_url = BeautifulSoup(result, 'lxml').find('div', class_='content').find('a').img['src']

  71.                        img_urls.append(img_url)

  72.                    else:

  73.                        img_url = BeautifulSoup(result, 'lxml').find('div', class_='content').find('img')['src']

  74.                        img_urls.append(img_url)

  75.                for cnt, url in enumerate(img_urls):

  76.                    save_pic(url, cnt)

  77.    except Exception as e:

  78.        print(e)

  79. if __name__ == "__main__":

  80.    urls = ['http://mmjpg.com/mm/{cnt}'.format(cnt=cnt) for cnt in range(1, 953)]

  81.    pool = Pool(processes=cpu_count ())

  82.    try:

  83.        delete_empty_dir(dir_path)

  84.        pool.map(urls_crawler, urls)

  85.    except Exception as e:

  86.        time.sleep(30)

  87.        delete_empty_dir(dir_path)

  88.        pool.map( urls_crawler, urls)

爬取网络小说(让你今天不那么孤单无聊)


  1. import urllib.request

  2. import re

  3. # 1 获取主页源代码

  4. # 2 获取章节超链接

  5. # 3 获取章节超链接源码

  6. # 4 获取小说内容

  7. # 5 下载,文件操作

  8. # 驼峰命名法

  9. # 获取小说内容

  10. def getNovertContent():

  11.    #

  12.    html = urllib.request.urlopen("http://www.quanshuwang.com/book/0/269").read()

  13.    html = html.decode("gbk")

  14.    # 不加括号  不匹配

  15.    # 正则表达式  .*?  匹配所有

  16.    reg = r'

  17. (.*?)
  18. '

  19.    # 增加效率的

  20.    reg = re.compile(reg)

  21.    urls = re.findall(reg,html)

  22.    # print(urls)

  23.    # 列表

  24.    # [(http://www.quanshuwang.com/book/0/269/78850.html,第一章 山边小村),

  25.    # (http://www.quanshuwang.com/book/0/269/78854.html,第二章 青牛镇)]

  26.    for url in urls:

  27.        # 章节的URL地址

  28.        novel_url = url[0]

  29.        # 章节标题

  30.        novel_title = url[1]

  31.        chapt = urllib.request.urlopen(novel_url).read()

  32.        chapt_html = chapt.decode("gbk")

  33.         # r 表示原生字符串   \ \\d  r"\d"

  34.        reg = r'    (.*?) # 第一个参数   要替换的字符串   替换后的字符串

  35.        chapt_content = chapt_content[0].replace("    ","")

  36.        # print(chapt_content)    字符串  二愣子睁大着双眼,直直望着茅草和烂泥糊成的

  37.        chapt_content = chapt_content.replace("
    "
    ,"")

  38.        print("正在保存 %s"%novel_title)

  39.        # w 读写模式  wb

  40.        # f = open("{}.txt".format(novel_title),'w')

  41.        # f.write(chapt_content)

  42.        with open("{}.txt".format(novel_title),'w') as f:

  43.            f.write(chapt_content)

  44.        # f.close()

  45. getNovertContent()


爬取智联招聘(找一个高薪工作,赢娶白富美)


  1. #-*- coding: utf-8 -*-

  2. import re

  3. import csv

  4. import requests

  5. from tqdm import tqdm

  6. from urllib.parse import urlencode

  7. from requests.exceptions import RequestException

  8. def get_one_page( city, keyword, region, page):

  9.   '''

  10.   获取网页html内容并返回

  11.   '''

  12.   paras = {

  13.       'jl': city,         # 搜索城市

  14.       'kw': keyword,      # 搜索关键词

  15.       'isadv': 0,         # 是否打开更详细搜索选项

  16.       'isfilter': 1,      # 是否对结果过滤

  17.       'p': page,          # 页数

  18.       're': region        # region的缩写,地区,2005代表海淀

  19.   }

  20.   headers = {

  21.       'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36',

  22.       'Host' : 'sou.zhaopin.com',

  23.       'Referer': 'https://www.zhaopin.com/',

  24.       'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8',

  25.       'Accept-Encoding': 'gzip, deflate, br',

  26.       'Accept-Language': 'zh-CN,zh;q=0.9'

  27.   }

  28.   url = 'https://sou.zhaopin.com/jobs/searchresult.ashx?' + urlencode (paras)

  29.   try:

  30.       # 获取网页内容,返回html数据

  31.       response = requests.get(url, headers=headers)

  32.       # 通过状态码判断是否获取成功

  33.       if response.status_code == 200:

  34.           return response.text

  35.       return None

  36.   except RequestException as e:

  37.       return None

  38. def parse_one_page(html):

  39.   '''

  40.   解析HTML代码,提取有用信息并返回

  41.   '''

  42.   # 正则表达式进行解析

  43.   pattern = re.compile( '(.*?).*?'        # 匹配职位信息

  44.       '(.*?).*?'     # 匹配公司网址和公司名称

  45.       '(.*?)', re.S)                                # 匹配月薪      

  46.   # 匹配所有符合条件的内容

  47.   items = re.findall(pattern, html)  

  48.   for item in items:

  49.       job_name = item[0]

  50.       job_name = job_name.replace('', '')

  51.       job_name = job_name.replace('', '')

  52.       yield {

  53.           'job': job_name,

  54.           'website': item[1 ],

  55.           'company': item[2],

  56.           'salary': item[3]

  57.       }

  58. def write_csv_file(path, headers, rows):

  59.   '''

  60.   将表头和行写入csv文件

  61.   '''

  62.   # 加入encoding防止中文写入报错

  63.   # newline参数防止每写入一行都多一个空行

  64.   with open(path, 'a', encoding='gb18030', newline='') as f:

  65.       f_csv = csv.DictWriter(f, headers)

  66.       f_csv.writeheader()

  67.       f_csv.writerows(rows)

  68. def write_csv_headers(path, headers):

  69.   '''

  70.   写入表头

  71.   '''

  72.   with open(path, 'a', encoding='gb18030', newline='') as f:

  73.       f_csv = csv.DictWriter( f, headers)

  74.       f_csv.writeheader()

  75. def write_csv_rows(path, headers, rows):

  76.   '''

  77.   写入行

  78.   '''

  79.   with open(path, 'a', encoding='gb18030', newline='') as f:

  80.       f_csv = csv.DictWriter(f, headers)

  81.       f_csv.writerows(rows)

  82. def main(city, keyword, region, pages):

  83.   '''

  84.   主函数

  85.   '''

  86.   filename = 'zl_' + city + '_' + keyword + '.csv'

  87.   headers = ['job', 'website', 'company', 'salary']

  88.   write_csv_headers(filename, headers)

  89.   for i in tqdm(range(pages)):

  90.       '''

  91.       获取该页中所有职位信息,写入csv文件

  92.       '''

  93.       jobs = []

  94.       html = get_one_page(city, keyword, region, i)

  95.       items = parse_one_page(html)

  96.       for item in items:

  97.           jobs.append(item)

  98.       write_csv_rows(filename, headers, jobs)

  99. if __name__ == '__main__':

  100.   main('北京', 'python工程师', 2005, 10)

520表白神器(让你七夕的时候不再孤单)


  1. from turtle import *

  2. from time import sleep

  3. def go_to(x, y):

  4.   up()

  5.   goto(x, y)

  6.   down()

  7. def big_Circle(size):  #函数用于绘制心的大圆

  8.   speed( 1)

  9.   for i in range(150):

  10.       forward(size)

  11.       right(0.3)

  12. def small_Circle(size):  #函数用于绘制心的小圆

  13.   speed(1)

  14.   for i in range(210):

  15.       forward(size)

  16.       right(0.786)

  17. def line(size):

  18.   speed(1)

  19.   forward(51*size)

  20. def heart( x, y, size):

  21.   go_to(x, y)

  22.   left(150)

  23.   begin_fill()

  24.   line(size)

  25.   big_Circle(size)

  26.   small_Circle(size)

  27.   left(120)

  28.   small_Circle(size)

  29.   big_Circle(size )

  30.   line(size)

  31.   end_fill()

  32. def arrow():

  33.   pensize(10)

  34.   setheading(0)

  35.   go_to(-400, 0)

  36.   left(15)

  37.   forward( 150)

  38.   go_to(339, 178)

  39.   forward(150)

  40. def arrowHead():

  41.   pensize(1)

  42.   speed(1)

  43.   color('red', 'red')

  44.   begin_fill()

  45.   left(120)

  46.   forward(20)

  47.   right(150)

  48.   forward(35)

  49.   right(120)

  50.   forward(35)

  51.   right(150)

  52.   forward(20)

  53.   end_fill ()

  54. def main():

  55.   pensize(2)

  56.   color('red', 'pink')

  57.   #getscreen().tracer(30, 0) #取消注释后,快速显示图案

  58.   heart(200, 0, 1)          #画出第一颗心,前面两个参数控制心的位置,函数最后一个参数可控制心的大小

  59.   setheading(0)             #使画笔的方向朝向x轴正方向

  60.   heart(-80, -100, 1.5)     #画出第二颗心

  61.   arrow()                   #画出穿过两颗心的直线

  62.   arrowHead()               #画出箭的箭头

  63.   go_to(400, -300)

  64.   write("author:520Python", move=True, align="left", font=( "宋体", 30, "normal"))

  65.   done()

  66. main()



今天看啥 - 高品质阅读平台
本文地址:http://www.jintiankansha.me/t/tdQY8OYRwP
Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/12243
 
306 次点击