基本的なプログラミングのpython:送信要求scrapyを使用してPythonのポストピット

この記事では、scrapyセンドポスト要求ピットの使用が記載され、小扁は、共有への皆のために、今、非常に良い感じが、また、基準となります。一緒に小さなシリーズに従うことを、是非、参照
要求を送信するためにポストの要求を使用する
ことがどれだけ簡単に使用要求、送信要求にあるを見てPOSTリクエストを送信します

リクエストのHTTPすべてのタイプが明らかにされているという単純なAPI手段を要求します。たとえば、あなたはそのようにHTTP POSTリクエストを送信することができます:

>>>r = requests.post('http://httpbin.org/post', data = {'key':'value'})

パラメータとして渡すことができる辞書データを使用するだけでなく、先祖渡すことができます

>>>payload = (('key1', 'value1'), ('key1', 'value2'))
>>>r = requests.post('http://httpbin.org/post', data=payload)
>>>print(r.text)
{
 ...
 "form": {
  "key1": [
   "value1",
   "value2"
  ]
 },
 ...
}

JSONが渡されます

>>>import json
 
>>>url = 'https://api.github.com/some/endpoint'
>>>payload = {'some': 'data'}
 
>>>r = requests.post(url, data=json.dumps(payload))

バージョン2.4.2の新機能を追加しました:

>>>url = 'https://api.github.com/some/endpoint'
>>>payload = {'some': 'data'}
 
>>>r = requests.post(url, json=payload)

言い換えれば、あなたはデータのみ=またはJSONの使用に焦点を当てる必要があります変更パラメータに何もする必要はありません=、要求の残りの部分は助けあなたに行われています。

使用して、ポストへの要求を送信scrapy
我々はキャリーやログインのパラメータに要求を送信する必要がある場合、要求は、以下では、たとえば、ソースコードによって要求された必要性のポストが、見ることができ、送信されますscrapyデフォルト

from scrapy.spider import CrawlSpider
from scrapy.selector import Selector
import scrapy
import json
class LaGou(CrawlSpider):
  name = 'myspider'
  def start_requests(self):
    yield scrapy.FormRequest(
      url='https://www.******.com/jobs/positionAjax.json?city=%E5%B9%BF%E5%B7%9E&needAddtionalResult=false',
      formdata={
        'first': 'true',#这里不能给bool类型的True,requests模块中可以
        'pn': '1',#这里不能给int类型的1,requests模块中可以
        'kd': 'python'
      },这里的formdata相当于requ模块中的data,key和value只能是键值对形式
      callback=self.parse
    )
  def parse(self, response):
    datas=json.loads(response.body.decode())['content']['positionResult']['result']
    for data in datas:
      print(data['companyFullName'] + str(data['positionId']))

公式HTTP送信データのPOST経由にFormRequestを使用推奨

return [FormRequest(url="http://www.example.com/post/action",
          formdata={'name': 'John Doe', 'age': '27'},
          callback=self.after_post)]

ここで使用FormRequestであり、FORMDATAパス・パラメータを使用し、ここを参照してください辞書です。

しかし、少しスーパーピットに、今日の午後を投げる、問題はデータを返すために行われますかリクエストを送信するには、この方法を使用することは、私が欲しいものをされていない
return scrapy.FormRequest(url, formdata=(payload))
長い時間のためのインターネット上で、最終的な方法を発見しました、 scrapy.Request送信要求を使用して、データ収集が正常であることができます。
return scrapy.Request(url, body=json.dumps(payload), method='POST', headers={'Content-Type': 'application/json'},)
参考:ScrapymyでPOSTリクエストを送ります

_data = {'field1': 'value1', 'field2': 'value2'}
request = scrapy.Request( url, method='POST', 
             body=json.dumps(my_data), 
             headers={'Content-Type':'application/json'} )

FormRequestとリクエスト差
文書では、ほとんど違いを見ることができ、

The FormRequest class adds a new argument to the constructor. The remaining arguments are the same as for the Request class and are not documented here.
Parameters: formdata (dict or iterable of tuples) – is a dictionary (or iterable of (key, value) tuples) containing HTML Form data which will be url-encoded and assigned to the body of the request.

彼はFormRequestいるFormDataは、タプルは、反復、およびリクエストボディに変換し、それをすることができ含まれているフォームデータや辞書を受けて、新しいパラメータを追加したと述べました。そして、継承されたリクエストのFormRequest

class FormRequest(Request):
 
  def __init__(self, *args, **kwargs):
    formdata = kwargs.pop('formdata', None)
    if formdata and kwargs.get('method') is None:
      kwargs['method'] = 'POST'
 
    super(FormRequest, self).__init__(*args, **kwargs)
 
    if formdata:
      items = formdata.items() if isinstance(formdata, dict) else formdata
      querystr = _urlencode(items, self.encoding)
      if self.method == 'POST':
        self.headers.setdefault(b'Content-Type', b'application/x-www-form-urlencoded')
        self._set_body(querystr)
      else:
        self._set_url(self.url + ('&' if '?' in self.url else '?') + querystr)
      ###
 
 
def _urlencode(seq, enc):
  values = [(to_bytes(k, enc), to_bytes(v, enc))
       for k, vs in seq
       for v in (vs if is_listlike(vs) else [vs])]
  return urlencode(values, doseq=1)

リクエストを見て、「キー=値&K = V」に変換され、デフォルトメソッドがPOSTである我々は、最終的な{「V」:「値」、「K」キー '}を通過します

class Request(object_ref):
 
  def __init__(self, url, callback=None, method='GET', headers=None, body=None,
         cookies=None, meta=None, encoding='utf-8', priority=0,
         dont_filter=False, errback=None, flags=None):
 
    self._encoding = encoding # this one has to be set first
    self.method = str(method).upper()

デフォルトの方法は、実際には、影響を受けないが、GETです。あなたはまだポスト要求を送信することができます。それは私がリクエストで定義された方法に基づいている要求、での使用要求を考えることができます。

def request(method, url, **kwargs):
  """Constructs and sends a :class:`Request <Request>`.
 
  :param method: method for the new :class:`Request` object.
  :param url: URL for the new :class:`Request` object.
  :param params: (optional) Dictionary or bytes to be sent in the query string for the :class:`Request`.
  :param data: (optional) Dictionary or list of tuples ``[(key, value)]`` (will be form-encoded), bytes, or file-like object to send in the body of the :class:`Request`.
  :param json: (optional) json data to send in the body of the :class:`Request`.
  :param headers: (optional) Dictionary of HTTP Headers to send with the :class:`Request`.
  :param cookies: (optional) Dict or CookieJar object to send with the :class:`Request`.
  :param files: (optional) Dictionary of ``'name': file-like-objects`` (or ``{'name': file-tuple}``) for multipart encoding upload.
    ``file-tuple`` can be a 2-tuple ``('filename', fileobj)``, 3-tuple ``('filename', fileobj, 'content_type')``
    or a 4-tuple ``('filename', fileobj, 'content_type', custom_headers)``, where ``'content-type'`` is a string
    defining the content type of the given file and ``custom_headers`` a dict-like object containing additional headers
    to add for the file.
  :param auth: (optional) Auth tuple to enable Basic/Digest/Custom HTTP Auth.
  :param timeout: (optional) How many seconds to wait for the server to send data
    before giving up, as a float, or a :ref:`(connect timeout, read
    timeout) <timeouts>` tuple.
  :type timeout: float or tuple
  :param allow_redirects: (optional) Boolean. Enable/disable GET/OPTIONS/POST/PUT/PATCH/DELETE/HEAD redirection. Defaults to ``True``.
  :type allow_redirects: bool
  :param proxies: (optional) Dictionary mapping protocol to the URL of the proxy.
  :param verify: (optional) Either a boolean, in which case it controls whether we verify
      the server's TLS certificate, or a string, in which case it must be a path
      to a CA bundle to use. Defaults to ``True``.
  :param stream: (optional) if ``False``, the response content will be immediately downloaded.
  :param cert: (optional) if String, path to ssl client cert file (.pem). If Tuple, ('cert', 'key') pair.
  :return: :class:`Response <Response>` object
  :rtype: requests.Response
 
  Usage::
 
   >>> import requests
   >>> req = requests.request('GET', 'http://httpbin.org/get')
   <Response [200]>
  """
 
  # By using the 'with' statement we are sure the session is closed, thus we
  # avoid leaving sockets open which can trigger a ResourceWarning in some
  # cases, and look like a memory leak in others.
  with sessions.Session() as session:
    return session.request(method=method, url=url, **kwargs)

、そして最終的に公共機関[プログラマ]の数では良い評判をお勧めする方法多くのより多くのコンテンツ、古いタイマー、スキルを学習体験、インタビューのスキル、職場体験や他のシェアを学習がたくさんある、より多くの我々は慎重に準備ゼロベースPythonプログラマの技術のタイミングを説明するために、毎日、実際のプロジェクトデータの入門情報は、注意Iを覚えて、学び、細部に注意を払う必要性にする方法のいくつかを共有します
ここに画像を挿入説明

リリース6元記事 ウォンの賞賛0 ビュー5

おすすめ

転載: blog.csdn.net/chengxun02/article/details/104976025